Umleitungsdifferenzen zwischen &>> & und 2> & 1


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


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.