Was bedeutet & genau in der Ausgabeumleitung?

19

Ich sehe Dinge wie command 1> outoder mit 2>&1denen ich stderr umleiten kann, aber manchmal sehe ich auch &>selbst, usw.

Was ist der beste Weg, um zu verstehen &und was es genau bedeutet?

AJJ
quelle

Antworten:

26

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:

  1. Erstellen Sie eine Datei kokomit folgendem Inhalt:

    #!bin/bash
    
    ls j1
    echo "koko2"
    
  2. Mach es ausführbar: chmod u+x koko

  3. Nun beachte, dass es j1das nicht gibt

  4. Jetzt lauf ./koko &> output

  5. 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.

George Udosen
quelle
2
Was ist &>gemein?
AJJ
1
Beachten Sie, dass 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.
Byte Commander
2
"Das wird an die gesendet, standard outputdie Sie in Ihrem Terminal sehen werden." sollte das nicht "an die standard error" sein?
Frarugi87
1
Ja @ frarugi87 Ihr Recht korrigiert
George Udosen
1
@ George wow, du warst schnell;) Gute Arbeit
frarugi87
5

> FILE 2>&1und &> FILEsind gleichwertig. Siehe 8.2.3.2. Umleitung von Fehlern im Bash Guide für Anfänger Kapitel 8

J. Starnes
quelle
2
IIRC &> FILEist nur für Bash spezifisch, während >FILE 2>&1unter einer größeren Anzahl von Shells verstanden wird.
Byte Commander
@ByteCommander, ohh, ich wusste gar nicht, dass Bash so eine Abkürzung hat ... Ich habe immer 2> & 1 verwendet.
Psusi
1

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:

Sergiy Kolodyazhnyy
quelle