Was bedeutet> / dev / null 2> & 1 || Richtig gemein unter Linux?

5
"command "> /dev/null 2>&1 || true  

Jetzt sehe ich, dass wir die Ausgabe eines Befehls, den wir ausführen, an eine Nulldatei senden. Ich muss bestimmte Bedeutung für wissen*2>&1 || true*

Aso'K
quelle

Antworten:

12

TL; DR: >/dev/null 2>&1 || true Bringt den Befehl effektiv zum Schweigen, wobei alle (fehlerhaften oder normalen) Ausgaben und das Ergebnis des Befehls verworfen werden, jedoch keine seiner Nebenwirkungen. Was folgt, ist eine Erklärung dafür, warum.


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 praktisch Tastatur, Bildschirm und Bildschirm bedeutet (was jedoch nicht immer der Fall war).

Durch die Angabe > /dev/nullim Befehl (die Umleitung kann im Allgemeinen an eine beliebige Stelle innerhalb des Befehls erfolgen, steht jedoch konventionell am Ende oder sehr selten am Anfang), legen Sie fest, dass die Standardausgabe (implizit 1, aber mit angegeben werden kann, 1>anstatt nur >) sollte zum Schreiben umgeleitet werden /dev/null, wodurch alles verworfen wird, was darauf geschrieben ist.

2>&1leitet dann den Dateideskriptor 2 ( 2>) zu dem um, an den Dateideskriptor 1 derzeit gebunden ist ( &1).

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

Wenn > /dev/null 2>&1Sie also angeben, dass Sie die Standardausgabe des Befehls nach / dev / null umleiten möchten, leiten Sie Standardfehler in die Standardausgabe um (die wiederum nach / dev / null umgeleitet wird). Dadurch wird der Befehl stummgeschaltet, indem die gesamte Ausgabe, die an stdout oder stderr gesendet wird, verworfen wird.

Beachten Sie, dass einige Programme alternative Methoden zum Zeichnen auf dem Bildschirm verwenden, z. B. eine Terminalbibliothek wie ncurses, und im Allgemeinen davon nicht betroffen sind oder auf unerwartete Weise betroffen sind. Bei Programmen, die für die Verwendung als Pipe geschrieben wurden (einschließlich der meisten Programme, die einfachen Text auf dem Terminal ausgeben), funktioniert dies jedoch.

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 einer gewöhnlichen Pfeife, die eine einzelne Pfeife verwendet |und die linke Stange mit der rechten Stange verbindet. Das Gegenteil von ||ist, &&das die rechte Seite nur dann ausführt, wenn die linke Seite einen Beendigungsstatus von 0 zurückgibt, und ein komplementäres ist, ;das einfach mehrere Befehle trennt (der zweite Befehl wird unabhängig vom Beendigungsstatus des ersten Befehls ausgeführt ).

trueDies ist wiederum ein sehr einfaches Programm, dessen einziger Zweck es ist, mit einem erfolgreichen Status zu beenden. Es ist im Allgemeinen für sich genommen nicht sehr nützlich, kann aber zum Beispiel beim Schreiben von Bedingungen in Shell-Skripten sehr nützlich sein. Das Gegenteil ist, falsedas mit einem Fehlerstatus (ungleich Null) beendet wird, aber ansonsten, wie wahr, nichts tut.

Wenn Sie also || truenach einem Befehl anhängen , wissen Sie, dass in beiden Fällen etwas erfolgreich ausgeführt wurde, wenn die Ausführung dieses Befehlssatzes abgeschlossen ist. So wissen Sie, dass der aktuelle Statuscode (verfügbar in $?) immer eine erfolgreiche Ausführung anzeigt.

ein CVn
quelle
3

Was bedeutet "Befehl"> / dev / null 2> & 1 || Richtig gemein unter Linux?

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

>- ist dasselbe wie 1>und bedeutet STDOUTauf etwas umleiten

Dann wird die ganze Operation übersetzt als:

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

In Bezug auf || true- Wenn commandnicht 0 (Null) Exit - Status zurückkehren (dh in der Regel irgendeine Art von Fehler / Fehlern anzeigt) , dann trueCode gewaltsamen Satz Exit - Status auf 0 (Null) , die den Erfolg.

Alex
quelle
2>&1bedeutet konkret "STDERR ( 2) nach STDOUT ( 1) umleiten ".
Quixotic
@quixotic Danke! Fügte Ihre Anmerkung der Antwort hinzu.
Alex