Em relação à concha bash, acho que a melhor maneira de lembrar é entender o que está acontecendo.
Se tudo que você quer fazer é lembrar como obter o comando correto, você pode tentar
program > /results 2> /results
Isso é bom e óbvio, o que está acontecendo e é fácil de lembrar. ou seja,
-
1
STDOUT vai para /results
-
2
STDERR também está indo diretamente para /results
o problema é que isso não funciona como você esperaria. considere o seguinte:
arquivo
: /tmp/poem.txt
the quick brown fox jumped over the lazy dog
e execute o comando
grep "brown" /tmp/poem.txt NOT_A_FILE > /tmp/results 2> /tmp/results
então
$ cat /tmp/results
grep: NOT_A_FILE: No such file or directory
lazy dog
o que aconteceu aqui?
Meu entendimento é bash setup o redirecionamento apontando o STDERR diretamente para o arquivo /tmp/results
e por causa da natureza de >
que faz 2 coisas
-
normalmente cria um novo arquivo - nesse caso, a oportunidade passou quando o bash passou por essa rotina no momento em que a saída é gerada.
- insira diretamente no começo do arquivo. e não acrescentar como
>>
faz.
Portanto, neste caso STDERR, insere diretamente no início de /tmp/results
substituindo a saída de STDOUT.
Nota: se você usou >>
para anexar, você provavelmente poderia usar essa sintaxe.
No entanto, para corrigir o problema, é necessário - não redirecionar STDERR - para o arquivo diretamente, mas sim para mesclar a saída de STDERR no fluxo STDOUT, para que você não obtenha uma colisão.
Usando o operador operador 2>&1
obtém isso
grep "brown" poem.txt NOT_A_FILE > /tmp/results 2>&1
O &
permite que o bash diferencie de um arquivo chamado 1
e o descritor de arquivo 1
.
Para mim, a declaração 2>&1
explica exatamente o que está acontecendo - STDERR está sendo redirecionado no próprio STDOUT - e só acaba em /tmp/results
porque é onde o STDOUT é apontado (quase como um efeito colateral).
Ao contrário do que muitos guias afirmam, o que é que 2>&1
envia STDERR para onde o STDOUT é apontado. Se isso fosse verdade - você ainda teria o problema de sobrescrever.
Para mais informações, consulte - link