A página man do Bash menciona que há duas maneiras de redirecionar stderr e stdout :
&> file
e >& file
. Agora, observe que ele diz stderr e stdout.
No caso deste >file 2>&1
, estamos fazendo o redirecionamento do stdout (1) para o arquivo, mas também dizendo ao stderr (2) para ser redirecionado para o mesmo local que o stdout! Então o propósito pode ser o mesmo, mas a ideia é um pouco diferente. Em outras palavras, "John, vá para a escola; Suzzie vá para onde John for".
E quanto a preferência? &>
é uma coisa bash
. Então, se você estiver portando um script, isso não será feito. Mas se você está 100% certo de que seu script estará trabalhando apenas no sistema com o bash - então não há preferência
Aqui está um exemplo com dash
, o Debian Amquist Shell, que é o padrão do Ubuntu.
$ grep "YOLO" * &> /dev/null
$ grep: Desktop: Is a directory
grep: Documents: Is a directory
grep: Downloads: Is a directory
grep: Music: Is a directory
grep: Pictures: Is a directory
grep: Public: Is a directory
grep: Templates: Is a directory
grep: Videos: Is a directory
grep: YOLO: Is a directory
grep: bin: Is a directory
Como você pode ver, o stderr não está sendo redirecionado
Para resolver suas edições na pergunta, você pode usar a instrução if para verificar a variável $ SHELL e alterar os redirecionamentos de acordo
Mas, para a maioria dos casos, > file 2>&1
deve funcionar
Em termos mais técnicos, o formulário [integer]>&word
é chamado de Duplicando o Descritor do Arquivo de Saída , e é um recurso especificado pelo padrão POSIX Shell Command Language, que é suportado pela maioria dos shells compatíveis com POSIX e tipo Brourne.
Veja também O que & amp; significa exatamente no redirecionamento de saída?