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
kokocom o seguinte conteúdo:#!bin/bash ls j1 echo "koko2" -
Torne-o executável:
chmod u+x koko -
Agora observe que
j1não existe -
Agora execute
./koko &> output -
execute
cat outpute 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.