Was bedeutet & genau in der Ausgabeumleitung?

14

Ich sehe Sachen wie command 1> out oder mit 2>&1 , um stderr umzuleiten, aber manchmal sehe ich auch &> selbst, etc.

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

    
Aruka J 25.09.2017, 00:37
quelle

3 Antworten

21

Das & in 2>&1 sagt einfach, dass die Zahl 1 ein Dateideskriptor und kein Dateiname ist. In diesem Fall standard output file descriptor .

Wenn Sie 2>1 verwenden, würde dies Fehler in eine Datei mit dem Namen 1 umleiten, aber wenn Sie 2>&1 verwenden, dann würde es an die standard output stream senden.

Diese &> sagt, sende beide, standard output und standard error , irgendwo. Zum Beispiel ls <non-existent_file> &> out.file . Lassen Sie mich das an einem Beispiel illustrieren.

Setup:

  1. Erstellen Sie eine Datei koko mit dem folgenden Inhalt:

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

  3. Beachten Sie, dass j1 nicht existiert

  4. Führen Sie jetzt ./koko &> output

  5. aus
  6. Führen Sie cat output aus und Sie werden

    sehen
    ls: cannot access 'j1': No such file or directory
    koko2
    

Sowohl standard error ( ls: cannot access 'j1': No such file or directory ) als auch standard output ( koko2 ) wurden an die Datei output gesendet.

Führe es jetzt erneut aus, aber diesmal wie folgt:

./koko > output

Mach cat output und du wirst nur koko2 sehen. Aber nicht die Fehlerausgabe vom Befehl ls j1 . Das wird an die standard error gesendet, die Sie in Ihrem Terminal sehen werden.

Wichtiger Hinweis dank @Byte Commander:

Beachten Sie, dass in command >file 2>&1 die Reihenfolge der Umleitung wichtig ist. Wenn Sie stattdessen command 2>&1 >file schreiben (was normalerweise nicht das ist, was Sie wollen), wird zuerst die stdout des Befehls an die Datei umgeleitet und danach die stderr des Befehls auf die nun nicht verwendete stdout umgeleitet, so dass es angezeigt wird oben im Terminal und Sie könnten es pipen oder es erneut umleiten, aber es wird nicht in die Datei geschrieben.

    
George Udosen 25.09.2017, 00:55
quelle
4

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

>     
J. Starnes 25.09.2017 00:58
quelle
0

Das [n]>&word heißt Ausgabedateideskriptor duplizieren (siehe Abschnitt 2.7 .6 des POSIX Shell Language Standards). Dieses besondere Verhalten ist eine Eigenschaft von Bourne-artigen Schalen, einschließlich ksh , dash und bash ; Der Standard basiert auf der Bourne-Shell und ksh . Suche in tcsh und csh Manuals, sie bieten anscheinend keine Möglichkeit, einen Dateideskriptor zu duplizieren, aber aus der Beschreibung von >& verhält sich das wie &> in bash (das heißt, leitet Fehler und normale Ausgaben an Datei).

In * nix-ähnlichen Systemen, einschließlich Ubuntu, hört man oft, dass alles eine Datei ist, oder eher ein Dateideskriptor . Die Standardausgabe ist der konstante Dateideskriptor 1 und der Standardfehler ist der Dateideskriptor 2. So bedeutet > FILE 2>&1 technisch den doppelten Dateideskriptor 2 auf den Dateideskriptor 1. Mit anderen Worten von diese Antwort :

  

Die 2 & gt; & amp; 1 weist die Shell an, dem Befehl einen Dateideskriptor 2 zu geben, der ein Duplikat des Deskriptors 1 ist (d. h. stderr & amp; stdout zeigen auf dasselbe fd).

Der Schlüssel hier ist zu beachten, dass der Deskriptor 1 zuerst gesetzt werden muss. Da Shell-Prozesse Umleitungen in der Reihenfolge von links nach rechts durchführen, weist die command >FILE 2&1 die Shell an, stdout für command neu zu verdrahten, um zuerst in FILE zu gehen, und nur dann kann der descriptor 2 eine Kopie von 1 werden, also 1 und 2 Punkte Standort - FILE .

Dies geht natürlich über den Standardfehler und die Standardausgabe hinaus. Wie in diese Antwort angezeigt wird, indem Sie 3&>2

ausführen
  

... duplizierst (dup2) filedescritor 2 auf den Dateideskriptor 3, schließt möglicherweise den Dateideskriptor 3, falls er bereits geöffnet ist

Ein Beispiel für die Manipulation von Dateideskriptoren wäre die Erfassung der Ausgabe des Befehls dialog in die Variable

Es ist auch erwähnenswert, dass &> spezifisch für bash ist. In zsh verhält es sich genauso, aber laut Dokumentation "... hat es nicht die gleiche Wirkung wie "Wort 2 & gt; & amp; 1" in Gegenwart von multios ". In POSIX-kompatiblen /bin/sh wird dies als reguläre Umleitung mit Putting-Befehl im Hintergrund behandelt. Siehe auch Gibt es irgendeinen SH-Code, der nicht syntaktisch gültiger Bash-Code ist? .

    
Sergiy Kolodyazhnyy 03.05.2018 20:02
quelle

Tags und Links