De acordo com " Linux: a referência completa, 6ª edição " (pág. 44), você pode canalizar apenas o STDERR usando os |&
símbolos de redirecionamento.
Eu escrevi um script bastante simples para testar isso:
#!/bin/bash
echo "Normal Text."
echo "Error Text." >&2
Eu executo esse script assim:
./script.sh |& sed 's:^:\t:'
Presumivelmente, apenas as linhas impressas em STDERR serão recuadas. No entanto, ele realmente não funciona assim, como eu vejo:
Normal Text.
Error Text.
O que eu estou fazendo errado aqui?
fonte
./script.sh > /tmp/stdout_goes_here |& grep 'grepping_script_stderr'
não funcionar conforme pretendido, ou seja: redirecionamentoscript.sh
'sstdout
(o que, de acordo com o trecho manual deve acontecer primeiro), em seguida, permitirgrep
processar o script destderr
. Em vez disso,stderr
e tdout` terminam emstdout_goes_here
|&
é mais curto para2>&1 |
. Então,>/tmp/stdout_goes_here |&
redireciona o stdout para/tmp/stdout_goes_here
, em seguida,2>&1
redireciona o stderr para onde quer que o stdout esteja, o que é/tmp/stdout_goes_here
, e finalmente|
não recebe nenhuma entrada porque a saída do comando foi redirecionada. Lembre-se de que>&1
redireciona para onde quer que o descritor de arquivos 1 esteja indo atualmente , e não para onde quer que o descritor de arquivos 1 acabe indo . Para canalizar apenas o stderr e redirecionar o stdout para um arquivo, é uma maneira2>&1 >/tmp/stdout_goes_here |
.|&
pipes stderr para stdin, como2>&1 |
, então o próximo programa terá ambos no stdin.fonte
runcommand 2>&1 | tee
? ieruncommand |& tee
?|&
no bash é apenas um atalho (não terrivelmente portátil) para2>&1 |
, então você deve ver todas as linhas recuadas.fonte