TL; DR: >/dev/null 2>&1 || true
Der Befehl wird stummgeschaltet, alle (fehlerhaften oder normalen) Ausgaben und das Ergebnis des Befehls werden verworfen, jedoch keine Nebeneffekte. Was folgt, ist eine Erklärung dafür.
Linux-Programme erhalten standardmäßig drei Dateideskriptoren, die geöffnet werden, bevor der Hauptcode des Programms ausgeführt wird. Dies sind stdin
(Standardeingabe, Dateideskriptor 0), stdout
(Standardausgabe, Dateideskriptor 1) und stderr
(Standardfehler, Dateideskriptor 2). Diese sind normalerweise an das aktuelle Terminal gebunden, was heute eigentlich die Tastatur, der Bildschirm und der Bildschirm bedeutet (dies war jedoch nicht immer der Fall).
Durch die Angabe > /dev/null
im Befehl (die Umleitung kann im Allgemeinen an eine beliebige Stelle innerhalb des Befehls gehen, wird jedoch normalerweise am Ende oder sehr selten am Anfang ausgeführt), geben Sie die Standardausgabe an (implizit 1
, kann aber 1>
statt mit nur angegeben werden >
). sollte zum Schreiben umgeleitet werden /dev/null
, wodurch alles, was geschrieben wird, verworfen wird.
2>&1
leitet dann den Dateideskriptor 2 ( 2>
) an den Dateideskriptor 1 weiter, an den aktuell gebunden ist ( &1
).
Eine Verknüpfung für das Umleiten von stdout
und stderr
zum selben Ort ist &>
wie in &> /dev/null
. Dies wird jedoch nicht in allen Shells unterstützt.
Indem > /dev/null 2>&1
Sie also angeben, dass Sie die Standardausgabe des Befehls in / dev / null umleiten möchten, leiten Sie den Standardfehler in die Standardausgabe um (die wiederum in / dev / null umgeleitet wird). Dies bewirkt, dass der Befehl stummgeschaltet wird, indem alle Ausgaben, die entweder an stdout oder stderr gesendet werden, weggeworfen werden.
Beachten Sie, dass einige Programme alternative Methoden zum Zeichnen auf dem Bildschirm verwenden, wie z. B. eine Terminalbibliothek wie ncurses, und werden im Allgemeinen davon nicht betroffen oder auf unerwartete Weise beeinflusst. Aber für Programme, die so geschrieben wurden, dass sie auf Pipe-Weise verwendet werden (was die meisten Programme umfasst, die einfachen Text an das Terminal ausgeben), funktioniert dies.
Das ||
wiederum bedeutet, dass, wenn das Programm gibt einen Exit - Status ungleich 0 (wobei per Konvention 0 bedeutet erfolgreiche Ausführung), dann die Schale den Befehl auf der anderen Seite der aufzurufen ||
, die in diesem Fall ist true
. Verwechseln Sie dies nicht mit der gewöhnlichen Pipe, die ein einzelnes verwendet |
und den linken stdout mit dem rechten stdin verbindet. Das Gegenteil von ||
ist, &&
dass die rechte Seite nur dann ausgeführt wird, wenn die linke Seite einen Exit-Status von 0 zurückgegeben hat und ein Komplementär ist, ;
der einfach mehrere Befehle trennt (der zweite Befehl wird unabhängig vom Exit-Status des ersten Befehls ausgeführt ).
true
wiederum ist ein sehr einfaches Programm, dessen einziger Zweck es ist, mit einem erfolgreichen Status zu beenden. Es ist im Allgemeinen an sich nicht sehr nützlich, kann aber beispielsweise beim Schreiben von Bedingungen in Shell-Skripts sehr nützlich sein. Das Gegenteil ist, false
dass es mit einem Fehlerstatus (Nicht-Null-Status) endet, aber ansonsten wie True nichts tut.
Wenn Sie also || true
nach einem Befehl anhängen, wissen Sie, dass etwas erfolgreich ausgeführt wird, wenn der Befehlssatz abgeschlossen ist. Sie wissen also, dass der aktuelle Statuscode (verfügbar in $?
) immer eine erfolgreiche Ausführung anzeigt.