Diferenças de redirecionamento entre &>> & e 2> & 1

12

Por esta discussão SO e alguns outros tópicos que tenho visto os seguintes comandos para redireccionar stdoute stderrpara um arquivo.

Eles são todos equivalentes? Existe alguma diferença entre eles?

command1 >> logfile 2>&1
command &> logfile
command >& logfile
Amelio Vazquez-Reina
fonte
1
Os dois últimos são equivilent: stackoverflow.com/q/11255447/1032785
jordanm

Respostas:

7

Desde que você marcou zsh, deixe-me dizer-lhe que todos os três redirecionamentos funcionam exatamente da mesma maneira. Como você pode ter lido nas postagens duplicadas (a do comentário e a da sua postagem), todas elas redirecionam stderrpara o stdoutqual o retorno é redirecionado para o arquivo 'logfile' (ou seja, o logfile conterá a saída e os erros )

Mas o comportamento deles muda MUITO dependendo do shell em que você está.

Todos os três estilos de redirecionamentos funcionam bem da mesma maneira bashezsh

Mas:

>&Funciona apenas em cshoutcsh

[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 ~]$

Em kshapenas 2>&1obras.

$ ./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

Eu odeio ksh. Embora tenha >&dado apenas um erro, o &>plano de fundo fez parte do comando e esvaziou o arquivo de log (se não estiver vazio).

Sree
fonte
1
O que você quis dizer sh? Se for shell POSIX, &>e >&não funcionar.
cuonglm
Infelizmente, a primeira afirmação é factualmente incorreta. Veja minha resposta para clobber vs append.
Tom Hale
1

&>e >&semi-equivalência (derrube)

A zshseção Redirecionamentos manual diz que:

  • &>
  • >&

são equivalentes.

Ambos irão derrotar o arquivo - truncá-lo para 0 bytes antes de gravá-lo, assim como > file faria no caso somente de STDIN.

No entanto , obash seção Redirecionamentos manuais acrescenta que:

Das duas formas, a primeira é preferida. Isso é semanticamente equivalente a

>word 2>&1

Ao usar o segundo formulário, palavra não pode ser expandida para um número ou -. Caso isso aconteça, outros operadores de redirecionamento se aplicam (consulte Duplicar descritores de arquivo abaixo) por motivos de compatibilidade.

Portanto, enquanto você marca zsh, provavelmente é uma boa prática obter a memória dos dedos na primeira forma, caso alguém escreva umbash script.

>> logfile 2>&1 e &>> equivalência (anexar)

Aqui, logfile não é substituído, mas aberto para gravação no final do arquivo, ou seja, modo de adição ( O_APPEND).

O equivalente em ambos {ba,z}sh é:

command1 &>> logfile

Dentro bash :

O formato para anexar saída padrão e erro padrão é:

&>>word

Isso é semanticamente equivalente a

>>word 2>&1

(consulte Duplicar descritores de arquivo abaixo).

(Nota: o uso de sobras de &>excesso >&na seção acima é recomendado novamente, pois existe apenas uma maneira de anexarbash .)

zshpermite ambos &>>e >>&formas.

Tom Hale
fonte