Antworten:
Das &
in 2>&1
sagt einfach, dass die Nummer 1
ein Dateideskriptor und kein Dateiname ist. In diesem Fall ist die standard output file descriptor
.
Wenn Sie verwenden 2>1
, wird dies Fehler in eine Datei umleiten, die aufgerufen wird. 1
Wenn Sie jedoch verwenden 2>&1
, wird der Fehler an die umgeleitete Datei gesendet standard output stream
.
Dies &>
sagt, senden Sie beide standard output
und standard error
irgendwohin. Zum Beispiel ls <non-existent_file> &> out.file
. Lassen Sie mich dies an einem Beispiel veranschaulichen.
Installieren:
Erstellen Sie eine Datei koko
mit folgendem Inhalt:
#!bin/bash
ls j1
echo "koko2"
Mach es ausführbar: chmod u+x koko
Nun beachte, dass es j1
das nicht gibt
Jetzt lauf ./koko &> output
renn cat output
und du wirst sehen
ls: cannot access 'j1': No such file or directory
koko2
Beide standard error
( ls: cannot access 'j1': No such file or directory
) und standard output
( koko2
) wurden an die Datei gesendet output
.
Führen Sie es jetzt erneut aus, aber diesmal wie folgt:
./koko > output
Tun cat output
und Sie werden nur das koko2
Gleiche sehen. Nicht jedoch die Fehlerausgabe des ls j1
Befehls. Das wird an die gesendet, standard error
die Sie in Ihrem Terminal sehen werden.
Wichtiger Hinweis dank @Byte Commander:
Beachten Sie, dass in command >file 2>&1
der Reihenfolge der Umleitung wichtig ist. Wenn Sie command 2>&1 >file
stattdessen schreiben (was normalerweise nicht der Fall ist, den Sie möchten), wird der Befehl zuerst stdout
in die Datei und danach stderr
in die jetzt nicht verwendete Datei umgeleitet stdout
, sodass er im Terminal angezeigt wird und Sie ihn weiterleiten oder umleiten können wieder, aber es wird nicht in die Datei geschrieben.
command >file 2>&1
die Reihenfolge der Umleitungen wichtig ist. Wenn Sie command 2>&1 >file
stattdessen schreiben (was normalerweise nicht der Fall ist, den Sie möchten), wird zunächst die Standardausgabe des Befehls in die Datei umgeleitet, und anschließend wird die Standardausgabe des Befehls in die jetzt nicht verwendete Standardausgabe umgeleitet, sodass sie im Terminal angezeigt wird und Sie sie weiterleiten können oder leiten Sie es erneut um, aber es wird nicht in die Datei geschrieben.
standard output
die Sie in Ihrem Terminal sehen werden." sollte das nicht "an die standard error
" sein?
> FILE 2>&1
und &> FILE
sind gleichwertig. Siehe 8.2.3.2. Umleitung von Fehlern im Bash Guide für Anfänger Kapitel 8
&> FILE
ist nur für Bash spezifisch, während >FILE 2>&1
unter einer größeren Anzahl von Shells verstanden wird.
Das [n]>&word
heißt Duplicating Output File Descriptor (siehe Abschnitt 2.7.6 von POSIX - Shell Sprache Standard). Dieses besondere Verhalten ist Merkmal von bourne artigen Schalen, einschließlich ksh
, dash
und bash
; Tatsächlich basiert der Standard auf Bourne Shell und ksh
. Wenn Sie in die Handbücher tcsh und csh schauen, bieten sie anscheinend keine Möglichkeit, einen Dateideskriptor zu duplizieren. Aus der Beschreibung von ergibt sich jedoch das gleiche >&
Verhalten wie &>
in bash
(dh, es leitet Fehler und normale Ausgabe in eine Datei um).
In * nix-ähnlichen Systemen, einschließlich Ubuntu, hört man oft, dass alles eine Datei oder vielmehr ein Dateideskriptor ist . Die Standardausgabe ist konstant Dateideskriptor 1 und Standardfehler ist Dateideskriptors 2. Also, > FILE 2>&1
technisch bedeutet doppeltes Dateideskriptor 2 auf Dateideskriptor 1. Mit anderen Worten von dieser Antwort :
2> & 1 weist die Shell an, dem Befehl einen Dateideskriptor 2 zuzuweisen, der ein Duplikat von Deskriptor 1 ist (dh stderr & stdout zeigen auf dasselbe fd).
Der Schlüssel hier ist zu beachten, dass Deskriptor 1 zuerst eingestellt werden muss. Da die Shell Umleitungen in der Reihenfolge von links nach rechts verarbeitet, weist sie die command >FILE 2>&1
Shell an, stdout neu zu verdrahten command
, um FILE
zuerst darauf zuzugreifen. Erst dann kann Deskriptor 2 zu einer Kopie von 1 werden, dh 1 und 2 zeigen auf dieselbe Position FILE
.
Dies geht natürlich über den Standardfehler und die Standardausgabe hinaus. Wie in dieser Antwort gezeigt , indem Sie tun3&>2
... Du duplizierst (dup2) Filedescritor 2 auf Filedescriptor 3 und schließt möglicherweise Filedescriptor 3, wenn es bereits geöffnet ist
Ein Beispiel für die Manipulation von Dateideskriptoren ist die Erfassung der Ausgabe eines dialog
Befehls in einer Variablen
Es ist auch erwähnenswert, dass dies &>
spezifisch ist bash
. Dabei zsh
verhält es sich genauso, aber laut Dokumentation hat "... in Gegenwart von Multios nicht die gleiche Wirkung wie '> Wort 2> & 1'". In POSIX-kompatiblen Umgebungen /bin/sh
wird dies als reguläre Umleitung behandelt, wenn der Befehl in den Hintergrund gestellt wird. Siehe auch, Gibt es einen SH-Code, der keinen syntaktisch gültigen Bash-Code enthält? .
Siehe auch:
&>
gemein?