Was macht> / dev / null 2> & 1 || wahres Mittel in Linux?

5894
Aso'K
"command "> /dev/null 2>&1 || true 

Jetzt bekomme ich die Ausgabe eines Befehls, den wir ausführen, in eine Null-Datei. Ich muss bestimmte Bedeutung für wissen*2>&1 || true*

4

2 Antworten auf die Frage

9
a CVn

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/nullim 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>&1leitet dann den Dateideskriptor 2 ( 2>) an den Dateideskriptor 1 weiter, an den aktuell gebunden ist ( &1).

Eine Verknüpfung für das Umleiten von stdoutund stderrzum selben Ort ist &>wie in &> /dev/null. Dies wird jedoch nicht in allen Shells unterstützt.

Indem > /dev/null 2>&1Sie 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 ).

truewiederum 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, falsedass es mit einem Fehlerstatus (Nicht-Null-Status) endet, aber ansonsten wie True nichts tut.

Wenn Sie also || truenach 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.

1
Alex

Was bedeutet "Befehl"> / dev / null 2> & 1 || wahres Mittel in Linux?

2>&1bedeutet "Weiterleitung STDERR(2) nach STDOUT(1)"
( STDERR(Standardfehler) hat vordefinierten Dateideskriptor gleich 2
und der STDOUTDateideskriptor (Standardausgabe) ist gleich 1)

>- ist das Gleiche 1>und bedeutet umleiten STDOUTauf etwas

Dann wird die gesamte Operation wie folgt übersetzt:

command > /dev/null 2>&1- Umleiten der STDOUT- und STDERR-Dateideskriptoren auf das "Schwarze Loch" oder ignorieren Sie grundsätzlich alle Ausgaben von command
("Schwarzes Loch" oder /dev/nullist ein spezielles Gerät, das Eingaben akzeptiert und intern ignoriert).

Betreffend || true- Wenn Sie den commandExit-Status nicht 0 (Null) zurückgeben (der normalerweise auf eine Art Fehler / einen Fehler hinweist), dann truesetzen Sie den Exit-Statuscode zwangsweise auf 0 (Null), um den Erfolg anzuzeigen.

Insbesondere bedeutet "2> & 1" "STDERR (" 2 ") zu STDOUT (" 1 ") umleiten". quixotic vor 7 Jahren 0
@quixotic Danke! Ihre Antwort wurde der Antwort hinzugefügt. Alex vor 7 Jahren 0