Differenze di reindirizzamento tra &>> & e 2> & 1


Risposte:


7

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


1
Cosa volevi dire sh? Se è la shell POSIX &>e >&non funziona.
cuonglm,

Purtroppo la prima affermazione è in realtà errata. Vedi la mia risposta per clobber vs append.
Tom Hale,

1

&>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>&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 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 è:

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

zshconsente sia &>>e >>&forme.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.