Su questo thread SO e su alcuni altri thread ho visto i seguenti comandi per il reindirizzamento stdout
e stderr
su un file.
Sono tutti equivalenti? C'è qualche differenza tra loro?
command1 >> logfile 2>&1
command &> logfile
command >& logfile
Su questo thread SO e su alcuni altri thread ho visto i seguenti comandi per il reindirizzamento stdout
e stderr
su un file.
Sono tutti equivalenti? C'è qualche differenza tra loro?
command1 >> logfile 2>&1
command &> logfile
command >& logfile
Risposte:
Dato che hai taggato zsh
, lascia che ti dica che tutti e 3 i reindirizzamenti funzionano esattamente allo stesso modo. Come potresti aver letto in entrambi i post duplicati (quello nel commento e quello nel tuo post), tutti reindirizzano stderr
verso il stdout
quale viene reindirizzato al file 'logfile' (cioè, il file di registro conterrà sia l'output che gli errori ).
Ma il loro comportamento cambia MOLTO a seconda della shell in cui ti trovi.
Tutti e tre gli stili di reindirizzamento funzionano bene allo stesso modo in bash
ezsh
Ma:
>&
Funziona solo con csh
otcsh
[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 ksh
soli 2>&1
lavori.
$ ./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
Odio ksh
. Mentre ha >&
appena dato un errore, ha eseguito lo &>
sfondo di una parte del comando e ha svuotato il file di registro (se non vuoto).
sh
? Se è la shell POSIX &>
e >&
non funziona.
&>
e >&
semi-equivalenza (clobber)La zsh
sezione Reindirizzamenti manuali dice che:
&>
>&
sono equivalenti.
Entrambi bloccheranno il file, troncandolo a 0 byte prima di scriverlo, proprio come > file
farebbe nel caso solo STDIN.
Tuttavia , la bash
sezione Reindirizzamenti manuali aggiunge che:
Delle due forme, la prima è preferita. Questo è semanticamente equivalente a
>word 2>&1
Quando si utilizza il secondo modulo, la parola non può espandersi in un numero o
-
. In tal caso, si applicano altri operatori di reindirizzamento (vedere Duplicazione dei descrittori di file di seguito) per motivi di compatibilità.
Quindi, mentre sei taggato zsh
, è probabilmente una buona pratica ottenere la memoria delle dita nella prima forma se uno dovesse mai scrivere una bash
sceneggiatura.
>> logfile 2>&1
ed &>>
equivalenza (append)Qui, logfile
non viene sovrascritto, ma aperto per la scrittura alla fine del file, ovvero aggiungere mode ( O_APPEND
).
L'equivalente in entrambi {ba,z}sh
è:
command1 &>> logfile
In bash
:
Il formato per l'aggiunta dell'output standard e dell'errore standard è:
&>>word
Questo è semanticamente equivalente a
>>word 2>&1
(vedere Duplicazione dei descrittori di file di seguito).
(Nota: l'uso di clobber di &>
over >&
nella sezione sopra è di nuovo raccomandato dato che c'è solo un modo per aggiungere bash
.)
zsh
consente sia &>>
e >>&
forme.