"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*
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/null
im 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>&1
leitet 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 stdout
und stderr
zum selben Ort ist &>
wie in &> /dev/null
. Dies wird jedoch nicht in allen Shells unterstützt.
Wenn > /dev/null 2>&1
Sie 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 ).
true
Dies 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, false
das mit einem Fehlerstatus (ungleich Null) beendet wird, aber ansonsten, wie wahr, nichts tut.
Wenn Sie also || true
nach 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.
Was bedeutet "Befehl"> / dev / null 2> & 1 || Richtig gemein unter Linux?
2>&1
bedeutet "umleiten STDERR
(2) zu STDOUT
(1)"
( STDERR
(Standardfehler) hat vordefinierten Dateideskriptor gleich 2
und der STDOUT
Dateideskriptor (Standardausgabe) ist gleich 1)
>
- ist dasselbe wie 1>
und bedeutet STDOUT
auf 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/null
ist ein spezielles Gerät, das Eingaben akzeptiert und intern ignoriert).
In Bezug auf || true
- Wenn command
nicht 0 (Null) Exit - Status zurückkehren (dh in der Regel irgendeine Art von Fehler / Fehlern anzeigt) , dann true
Code gewaltsamen Satz Exit - Status auf 0 (Null) , die den Erfolg.
2>&1
bedeutet konkret "STDERR (2
) nach STDOUT (1
) umleiten ".