Umleitungsdifferenzen zwischen &>> & und 2> & 1

12

Auf diesem SO-Thread und einigen anderen Threads habe ich die folgenden Befehle zum Umleiten stdoutund stderrin eine Datei gesehen.

Sind sie alle gleichwertig? Gibt es einen Unterschied zwischen ihnen?

command1 >> logfile 2>&1
command &> logfile
command >& logfile
Amelio Vazquez-Reina
quelle
1
Die letzten beiden sind gleichberechtigt: stackoverflow.com/q/11255447/1032785
Jordan

Antworten:

7

Da Sie getaggt haben zsh, lassen Sie mich Ihnen sagen, dass alle 3 Weiterleitungen genauso funktionieren. Wie Sie vielleicht beide doppelten Beiträge (den im Kommentar und den in Ihrem Beitrag) gelesen haben, leiten sie alle zu der Datei 'logfile' um, stderrin stdoutder inturn gespeichert ist (dh die Logdatei enthält sowohl die Ausgabe als auch die Fehler) ).

Aber ihr Verhalten ändert sich VIEL abhängig von der Shell, in der Sie sich befinden.

Alle drei Umleitungsarten funktionieren in bashund auf dieselbe Weisezsh

Aber:

Funktioniert nur >&in cshodertcsh

[soum@server ~]$  ./test.sh > logfile 2>&1
Ambiguous output redirect.
[soum@server ~]$ ./test.sh &> logfile
Invalid null command.
[soum@server ~]$ ./test.sh >& logfile
[soum@server ~]$ echo $SHELL
/bin/tcsh
[soum@server ~]$

In funktioniert kshnur 2>&1.

$ ./test.sh >& logfile
-ksh: logfile: bad file unit number
$ ./test.sh &> logfile
[1]     23039
$ 1  2  3  4  5  6  logfile  test.sh
ls: cannot access ttr: No such file or directory

[1] +  Done(2)                 ./test.sh &> logfile

Ich hasse ksh. Während >&nur ein Fehler ausgegeben wurde, hat der &>Benutzer einen Teil des Befehls im Hintergrund ausgeführt und die Protokolldatei geleert (falls nicht leer).

Sree
quelle
1
Was meinst du sh? Wenn es eine POSIX-Shell ist &>und >&nicht funktioniert.
Donnerstag,
Leider ist die erste Aussage sachlich falsch. Siehe meine Antwort für Clobber vs Append.
Tom Hale
1

&>und >&Halbäquivalenz (Clobber)

Im zshAbschnitt Manuelle Umleitungen heißt es:

  • &>
  • >&

sind gleichwertig.

Beide bereinigen die Datei - kürzen Sie die Datei auf 0 Byte, bevor Sie darauf schreiben, genau wie > filedies im STDIN-Fall der Fall ist.

Allerdings ist der bashmanuelle Umleitungen Abschnitt fügt hinzu , dass:

Von den beiden Formen ist die erste bevorzugt. Dies ist semantisch äquivalent zu

>word 2>&1

Wenn Sie die zweite Form verwenden, wird das Wort möglicherweise nicht zu einer Zahl oder erweitert -. In diesem Fall gelten aus Kompatibilitätsgründen andere Umleitungsoperatoren (siehe Duplizieren von Dateideskriptoren weiter unten).

Also, während Sie getaggt haben zsh, ist es wahrscheinlich eine gute Praxis, Fingergedächtnis in der ersten Form zu bekommen, sollte man jemals ein bashSkript schreiben .

>> logfile 2>&1und &>>Äquivalenz (anhängen)

Hier logfilewird nicht überschrieben, sondern am Ende der Datei zum Schreiben geöffnet, dh Modus anhängen ( O_APPEND).

Das Äquivalent in beiden {ba,z}shist:

command1 &>> logfile

In bash:

Das Format zum Anhängen der Standardausgabe und des Standardfehlers lautet:

&>>word

Dies ist semantisch äquivalent zu

>>word 2>&1

(Siehe Duplizieren von Dateideskriptoren weiter unten).

(Hinweis: Die Verwendung von &>over >&im obigen Abschnitt wird erneut empfohlen, da es nur eine Möglichkeit zum Anhängen gibt bash.)

zsherlaubt beides &>>und >>&formen.

Tom Hale
quelle