Su questo thread SO e su alcuni altri thread ho visto i seguenti comandi per il reindirizzamento stdoute stderrsu 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 stdoute stderrsu 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 stderrverso il stdoutquale 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 bashezsh
Ma:
>&Funziona solo con cshotcsh
[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 kshsoli 2>&1lavori.
$ ./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 zshsezione Reindirizzamenti manuali dice che:
&>>&sono equivalenti.
Entrambi bloccheranno il file, troncandolo a 0 byte prima di scriverlo, proprio come > filefarebbe nel caso solo STDIN.
Tuttavia , la bashsezione Reindirizzamenti manuali aggiunge che:
Delle due forme, la prima è preferita. Questo è semanticamente equivalente a
>word 2>&1Quando 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 bashsceneggiatura.
>> logfile 2>&1ed &>>equivalenza (append)Qui, logfilenon 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 è:
&>>wordQuesto è 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.)
zshconsente sia &>>e >>&forme.