Ich fand dies sehr hilfreich, wenn Sie ein Anfänger sind lesen diese
Aktualisierung:
In Linux- oder Unix-Systemen gibt es zwei Stellen, an die Programme ihre Ausgaben senden: Standardausgabe (stdout) und Standardfehler (stderr) Sie können diese Ausgaben in eine beliebige Datei umleiten.
Zum Beispiel, wenn Sie dies tun
ls -a > output.txt
Es wird nichts in der Konsole ausgegeben alle Ausgaben (stdout) wird in die Ausgabedatei umgeleitet.
Und wenn Sie versuchen, den Inhalt einer Datei zu drucken, die nicht beendet ist, wird ein Fehler ausgegeben, z.B. wenn Sie test.txt drucken, die nicht im aktuellen Verzeichnis vorhanden ist
cat test.txt > error.txt
Die Ausgabe wird sein
cat: test.txt :No such file or directory
Die Datei error.txt wird jedoch leer sein, da wir stdout in eine Datei umleiten und nicht stderr.
Wir brauchen also einen Dateideskriptor (Ein Dateideskriptor ist nichts anderes als eine positive ganze Zahl, die eine geöffnete Datei darstellt. Man kann sagen, dass der Deskriptor die eindeutige Kennung der Datei ist), um der Shell mitzuteilen, welche Art von Ausgabe wir an die Datei senden. In Unix/Linux-Systemen 1 ist für stdout und 2 für stderr .
Wenn Sie also Folgendes tun
ls -a 1> output.txt
bedeutet, dass Sie die Standardausgabe (stdout) an output.txt senden.
und wenn Sie dies tun
cat test.txt 2> error.txt
bedeutet, dass Sie den Standardfehler (stderr) an error.txt senden.
&1
wird verwendet, um auf den Wert des Dateideskriptors 1 (stdout) zu verweisen.
Nun zur Sache 2>&1
bedeutet "stderr an denselben Ort umleiten, an den wir stdout umleiten".
Jetzt können Sie dies tun
<br
cat maybefile.txt > output.txt 2>&1
werden sowohl die Standardausgabe (stdout) als auch die Standardfehler (stderr) in die Datei output.txt umgeleitet.
Dank an Ondrej K. für den Hinweis auf
63 Stimmen
@dbr Ich glaube nicht, dass es nur an der Bash liegt - ich glaube, es ist eine Sache der Bourne-Shell; daher sh, bash, ksh, ash, dash, usw.
8 Stimmen
Dies ist Teil des Umleitungsparagraphen, der POSIX-konforme Shells oder kurz POSIX-Shells beschreibt. ksh ist zum Beispiel eine POSIX-Shell. Siehe: pubs.opengroup.org/onlinepubs/009695399/utilities/
19 Stimmen
Dieses Konstrukt funktioniert auch unter Windows.
7 Stimmen
Es ist im Allgemeinen besser, wenn
2>&1
als 2>/dev/null ;-)18 Stimmen
Ich dachte, ich sollte erwähnen, dass
|&
ist die Kurzform für2>&1 |
wenn Sie zsh benutzen. Ich kann nicht sagen, ob das auch für andere Bourne-ähnliche Shells gilt oder ob es nur eine Funktion von zsh ist.4 Stimmen
@chrixian
|&
ist auch in Bash, eine großartige Funktion. Nicht POSIX scheint es aber (?)2 Stimmen
Sie können diese Antwort überprüfen stackoverflow.com/questions/10508843/what-is-dev-null-21/
0 Stimmen
@chrixian dies ist definitiv in tcsh erforderlich, da
2>^1
funktioniert dort nicht