Was bedeutet 2> / dev / null?

242

Ich möchte eine kurze Erklärung der folgenden Befehlszeile:

grep -i 'abc' content 2>/dev/null 
Naiv
quelle

Antworten:

347

Der Operator> leitet die Ausgabe normalerweise in eine Datei um, es kann sich jedoch auch um ein Gerät handeln. Sie können auch >> zum Anhängen verwenden.

Wenn Sie keine Zahl angeben, wird der Standardausgabestream angenommen, Sie können jedoch auch Fehler umleiten

> fileLeitet stdout zur Datei
1> fileum Leitet stdout zur Datei
2> fileum Leitet stderr zur Datei
&> fileum Leitet stdout und stderr zur Datei um

/dev/nullist das Null-Gerät, das beliebige Eingaben annimmt und wegwirft. Hiermit kann jede Ausgabe unterdrückt werden.

Warren Hill
quelle
6
Gibt es einen Unterschied zwischen > /dev/null 2>&1und&> /dev/null
Alexander Mills
13
In der heutigen Praxis glaube ich nicht, dass es 2>&1eine ältere Syntax gibt, also &>hätte das vor Jahren nicht funktioniert, aber beide sind gleichwertig.
Warren Hill
28

Kurz gesagt, es leitet stderr(fd 2) zum Schwarzen Loch um (verwirft die Ausgabe des Befehls).

Einige häufigere Anwendungsfälle für die Umleitung:

command > /dev/null 2>&1 &

Führen Sie commandim Hintergrund, verwerfen stdoutundstderr

command >> /path/to/log 2>&1 &

Führen Sie commandstdout und stderr aus und hängen Sie sie an eine Protokolldatei an.

In Bash 4+ ist eine kürzere (aber weniger lesbare) Form funktionsfähig

command &>> /path/to/log
Terry Wang
quelle
3
Gibt es einen guten Grund, > /dev/null 2>&1statt zu verwenden &> /dev/null?
Craig McQueen
7
@CraigMcQueen &>ist neu in Bash 4, der erstere ist nur der traditionelle Weg, ich bin nur so daran gewöhnt (leicht zu merken).
Terry Wang
@CraigMcQueen nach einem Kommentar zu dieser Antwort , &> /dev/nullmöglicherweise nicht in einigen Muscheln aber> / dev / null 2> & 1 wird in allen kompatibelen Schalen POSIX arbeiten.
Stack
3
Warum ist es 2> & 1 und nicht 2 & 1>?
marienbad
1
@marienbad das ist eigentlich eine frage die es sich zu posten lohnt :-) Die syntax ist fn>target, wo fneine dateinummer ist (0-2 normalerweise definieren einige programme mehr nummern) und targetist normalerweise ein dateiname aber hier ist es eine andere dateinummer - mit &dem vorangestellt ist die Syntax für "Ich möchte eine Dateinummer anstelle eines Dateinamens".
Toolforger
9

/dev/nullwird in Linux / Unix als schwarzes Loch behandelt, daher können Sie alles in dieses Feld einfügen, aber Sie können es nicht wiederherstellen /dev/null.

Ferner 2>bedeutet dies, dass Sie >das Stderr (dh 2) in das Schwarze Loch (dh /dev/null) umleiten.

Ihr Befehl lautet:

grep -i 'abc' content 2>/dev/null 

Versuchen Sie nicht, mit einem weiteren Schrägstrich wie diesem zu enden 2>/dev/null/(es ist kein Verzeichnis).

Indrajeet Gour
quelle
2

Der Inhalt von grep -i 'abc' generiert eine Ausgabe, die auf Ihrer Konsole angezeigt wird, einschließlich etwaiger Fehler.

Durch die Angabe 2>/dev/nullwerden die Fehler herausgefiltert, sodass sie nicht auf Ihrer Konsole ausgegeben werden.

Genauer gesagt: 2 steht für den Fehlerdeskriptor, in den Fehler geschrieben werden. Standardmäßig werden sie auf der Konsole ausgedruckt.

\> Leitet in diesem Fall die Ausgabe an den angegebenen Ort um /dev/null

/dev/null ist das Standard-Linux-Gerät, auf dem Sie Ausgaben senden, die ignoriert werden sollen.

Mauro Zallocco
quelle
Kurz und thematisch. Gute Antwort.
Sergiy Kolodyazhnyy