Antworten:
Das &in 2>&1sagt einfach, dass die Nummer 1ein 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. 1Wenn Sie jedoch verwenden 2>&1, wird der Fehler an die umgeleitete Datei gesendet standard output stream.
Dies &>sagt, senden Sie beide standard outputund standard errorirgendwohin. Zum Beispiel ls <non-existent_file> &> out.file. Lassen Sie mich dies an einem Beispiel veranschaulichen.
Installieren:
Erstellen Sie eine Datei kokomit folgendem Inhalt:
#!bin/bash
ls j1
echo "koko2"
Mach es ausführbar: chmod u+x koko
Nun beachte, dass es j1das nicht gibt
Jetzt lauf ./koko &> output
renn cat outputund 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 outputund Sie werden nur das koko2Gleiche sehen. Nicht jedoch die Fehlerausgabe des ls j1Befehls. Das wird an die gesendet, standard errordie Sie in Ihrem Terminal sehen werden.
Wichtiger Hinweis dank @Byte Commander:
Beachten Sie, dass in command >file 2>&1der Reihenfolge der Umleitung wichtig ist. Wenn Sie command 2>&1 >filestattdessen schreiben (was normalerweise nicht der Fall ist, den Sie möchten), wird der Befehl zuerst stdoutin die Datei und danach stderrin 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>&1die Reihenfolge der Umleitungen wichtig ist. Wenn Sie command 2>&1 >filestattdessen 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 outputdie Sie in Ihrem Terminal sehen werden." sollte das nicht "an die standard error" sein?
> FILE 2>&1und &> FILEsind gleichwertig. Siehe 8.2.3.2. Umleitung von Fehlern im Bash Guide für Anfänger Kapitel 8
&> FILEist nur für Bash spezifisch, während >FILE 2>&1unter einer größeren Anzahl von Shells verstanden wird.
Das [n]>&wordheiß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, dashund 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>&1technisch 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>&1Shell an, stdout neu zu verdrahten command, um FILEzuerst 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 dialogBefehls in einer Variablen
Es ist auch erwähnenswert, dass dies &>spezifisch ist bash. Dabei zshverhä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/shwird 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?