Em relação ao shell bash, acho que a melhor maneira de lembrar é entender o que está acontecendo.
Se tudo o que você quer fazer é lembrar como obter o comando correto, tente
program > /results 2> /results
Isso é legal e óbvio e é fácil de lembrar. ie
1
STDOUT vai /results
2
STDERR também vai 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 do >
que faz 2 coisas
- normalmente crie um novo arquivo - nesse caso, a oportunidade passou quando o bash passou dessa rotina no momento em que a saída é gerada.
- insira diretamente no início do arquivo. e não acrescentar como
>>
faz.
Portanto, neste caso, STDERR, insere diretamente no início da /tmp/results
substituição da saída de STDOUT.
Nota: se você costumava >>
anexar, provavelmente poderia se safar dessa sintaxe.
No entanto, para corrigir o problema, você precisa - não redirecionar o STDERR - para o arquivo diretamente, mas mesclar a saída do STDERR no fluxo STDOUT, para não ter uma colisão.
O uso do 2>&1
operador consegue isso
grep "brown" poem.txt NOT_A_FILE > /tmp/results 2>&1
O &
permite bash para distinguir de um arquivo chamado 1
eo 1
descritor de arquivo.
Para mim, a 2>&1
própria declaração explica exatamente o que está acontecendo - o STDERR está sendo redirecionado no próprio STDOUT - e só acaba /tmp/results
porque é para onde o STDOUT é apontado (quase como um efeito colateral).
Ao contrário do que muitos guias afirmam, que 2>&1
envia STDERR para onde quer que STDOUT seja apontado. Se isso fosse verdade - você ainda teria o problema de substituição.
Para mais informações, consulte - http://mywiki.wooledge.org/BashGuide/InputAndOutput#File_Redirection
program 1> /dev/null 2>/dev/null
. Algumas vezes, porém, é necessário misturar ostdout
estderr
juntos para ver o que realmente está acontecendo - como a saída de um processo de compilação complexo sendo redirecionado para um arquivo. Nesse caso, acabo pesquisando no Google