Kürzen oder verschmelzen Sie mehrere Zeilen von `&> / dev / null &`

11

Jedes Mal, wenn ich die Maschine starte, starte ich das folgende Programm:

$ cat start.sh
#! /bin/bash
google-chrome &> /dev/null &
lantern &> /dev/null &
xdg-open . &> /dev/null &
emacs &> /dev/null  &
code ~/Programs/ &> /dev/null &
xdg-open ~/Reference/topic_regex.md &> /dev/null &

Umständlich &> /dev/null &... Wie könnte ich die Logik verkürzen?

Infinitesimalrechnung
quelle
2
Sie können alle oder die meisten dieser Programme in Ihre Startanwendungen einfügen .
Bis auf weiteres angehalten.
tolle, fantastische Anwendung. In der Gnome-Sitzung traten normalerweise Fehler auf, die zu einem plötzlichen Absturz führten. Deshalb starte ich sie vom tmux-Server. @ TennisWilliamson
Kalkül

Antworten:

12

Der Teil &> /dev/nullbedeutet Ausgangsumleitung. Sie können mehrere Befehle in dieselbe Datei umleiten, indem Sie sie in einem Block gruppieren:

#! /bin/bash
{
google-chrome &
lantern &
xdg-open . &
emacs  &
code ~/Programs/ &
xdg-open ~/Reference/topic_regex.md &
} &> /dev/null

Das Gleiche kann jedoch nicht verwendet werden, um einzelne Befehle im Hintergrund zu starten ( &). Einlochen &nach dem Block würde bedeuten , den ganzen Block als ein einziges Skript im Hintergrund ausgeführt wird .

Melebius
quelle
Beachten Sie, dass die &>Syntax veraltet ist und durch >/dev/null 2>&1 wiki-dev.bash-hackers.org/scripting/obsolete
multithr3at3d
4
@ multithr3at3d Ein mit POSIX nicht kompatibler Bashismus? Sicher! Veraltet oder veraltet? Nein , unabhängig davon, was die drei Autoren dieser Liste, die zuletzt im Jahr 2015 bearbeitet wurden, denken. Es ist eine Kurzform, und das Kürzen von Befehlszeilen ist hier genau das Ziel von OP. Wenn jemand ein #!/bin/bashSkript in einer anderen Shell ausführt, ohne vorher die Portabilität zu überprüfen, ist es definitiv nicht Bashs Schuld, wenn es nicht funktioniert.
Nachtisch
12

Ich habe eine Funktion geschrieben und in meine eingefügt .bashrc, um Dinge auszuführen, die von meinem Terminal getrennt sind:

detach () 
{ 
    ( "$@" &> /dev/null & )
}

... und dann:

detach google-chrome
detach xdg-open ~/Reference/topic_regex.md

Und weil ich faul bin, habe ich auch eine Verknüpfung geschrieben für xdg-open:

xo () 
{ 
    for var in "$@"; do
        detach xdg-open "$var";
    done
}

Da xdg-opengenau ein Argument erwartet wird, xodurchläuft die Funktion alle angegebenen Argumente und ruft xdg-openjedes einzeln auf.

Dies ermöglicht:

detach google-chrome
xo . ~/Reference/topic_regex.md
PerlDuck
quelle
5

Sie können die Ausgabe für alle nachfolgenden Befehle mit umleiten

exec 1>/dev/null
exec 2>/dev/null
Ach nein
quelle
3

Sie können eine Schleife erstellen und ihr die Befehle als Argumente geben:

for i in google-chrome "xdg-open ." "code ~/Programs/"; do
  $i &
done &>/dev/null

Beachten Sie, dass es genau wie beim Subshell-Ansatz mit geschweiften Klammern möglich ist, die Ausgaben zusammenzufassen und alle gleichzeitig umzuleiten.

Dessert
quelle
3

Ich habe eine spezielle Datei wie /dev/nullmit einem kürzeren Pfad erstellt, um die Umleitung zu verkürzen. Ich habe /nals Pfad der neuen Datei verwendet:

sudo mknod -m 0666 /n c 1 3

Auf diese Weise können Sie die einzelnen Zeilen auf z.

google-chrome &>/n &

Quelle: Wie erstelle ich / dev / null?

Dessert
quelle