Auf diesem SO-Thread und einigen anderen Threads habe ich die folgenden Befehle zum Umleiten stdout
und stderr
in eine Datei gesehen.
Sind sie alle gleichwertig? Gibt es einen Unterschied zwischen ihnen?
command1 >> logfile 2>&1
command &> logfile
command >& logfile
shell
zsh
io-redirection
Amelio Vazquez-Reina
quelle
quelle
Antworten:
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,stderr
instdout
der 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
bash
und auf dieselbe Weisezsh
Aber:
Funktioniert nur
>&
incsh
odertcsh
In funktioniert
ksh
nur2>&1
.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).quelle
sh
? Wenn es eine POSIX-Shell ist&>
und>&
nicht funktioniert.&>
und>&
Halbäquivalenz (Clobber)Im
zsh
Abschnitt 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
> file
dies im STDIN-Fall der Fall ist.Allerdings ist der
bash
manuelle Umleitungen Abschnitt fügt hinzu , dass:Also, während Sie getaggt haben
zsh
, ist es wahrscheinlich eine gute Praxis, Fingergedächtnis in der ersten Form zu bekommen, sollte man jemals einbash
Skript schreiben .>> logfile 2>&1
und&>>
Äquivalenz (anhängen)Hier
logfile
wird nicht überschrieben, sondern am Ende der Datei zum Schreiben geöffnet, dh Modus anhängen (O_APPEND
).Das Äquivalent in beiden
{ba,z}sh
ist:In
bash
:(Hinweis: Die Verwendung von
&>
over>&
im obigen Abschnitt wird erneut empfohlen, da es nur eine Möglichkeit zum Anhängen gibtbash
.)zsh
erlaubt beides&>>
und>>&
formen.quelle