O &
em 2>&1
simplesmente diz que o número 1
é um descritor de arquivo e não um nome de arquivo. Nesse caso, o standard output file descriptor
.
Se você usar 2>1
, isso redirecionaria os erros para um arquivo chamado 1
, mas se você usar 2>&1
, ele o enviaria para o standard output stream
.
Isso &>
diz para enviar ambos, standard output
e standard error
, em algum lugar. Por exemplo, ls <non-existent_file> &> out.file
. Deixe-me ilustrar isso com um exemplo.
Configuração:
-
Crie um arquivo
koko
com o seguinte conteúdo:#!bin/bash ls j1 echo "koko2"
-
Torne-o executável:
chmod u+x koko
-
Agora observe que
j1
não existe -
Agora execute
./koko &> output
-
execute
cat output
e você veráls: cannot access 'j1': No such file or directory koko2
Ambos, standard error
( ls: cannot access 'j1': No such file or directory
) e standard output
( koko2
), foram enviados para o arquivo output
.
Agora execute novamente, mas desta vez assim:
./koko > output
Faça cat output
e você verá apenas koko2
como. Mas não a saída de erro do comando ls j1
. Isso será enviado para o standard error
que você verá no seu terminal.
Nota importante graças ao @Byte Commander:
Observe que, em command >file 2>&1
, a ordem do redirecionamento é importante. Se você escrever command 2>&1 >file
(que normalmente não é o que você deseja), ele primeiro redirecionará o stdout
do comando para o arquivo e depois redirecionará o stderr
do comando para seu stdout
, que não é usado, então ele mostrará no terminal e você poderia canalizá-lo ou redirecioná-lo novamente, mas ele não será gravado no arquivo.