Por esta discussão SO e alguns outros tópicos que tenho visto os seguintes comandos para redireccionar stdout
e stderr
para um arquivo.
Eles são todos equivalentes? Existe alguma diferença entre eles?
command1 >> logfile 2>&1
command &> logfile
command >& logfile
shell
zsh
io-redirection
Amelio Vazquez-Reina
fonte
fonte
Respostas:
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 redirecionamstderr
para ostdout
qual 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
bash
ezsh
Mas:
>&
Funciona apenas emcsh
outcsh
Em
ksh
apenas2>&1
obras.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).fonte
sh
? Se for shell POSIX,&>
e>&
não funcionar.&>
e>&
semi-equivalência (derrube)A
zsh
seçã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 , o
bash
seção Redirecionamentos manuais acrescenta que: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
é:Dentro
bash
:(Nota: o uso de sobras de
&>
excesso>&
na seção acima é recomendado novamente, pois existe apenas uma maneira de anexarbash
.)zsh
permite ambos&>>
e>>&
formas.fonte