Por que a saída de alguns programas Linux não é STDOUT nem STDERR?
Na verdade, quero saber como capturar de forma confiável toda a saída do programa, independentemente do 'fluxo' que ele usa. O problema que tenho é que alguns programas parecem não permitir que sua saída seja capturada.
Um exemplo é o comando 'time':
time sleep 1 2>&1 > /dev/null
real 0m1.003s
user 0m0.000s
sys 0m0.000s
ou
time sleep 1 &> /dev/null
real 0m1.003s
user 0m0.000s
sys 0m0.000s
Por que vejo a saída nas duas vezes? Eu esperava que tudo fosse canalizado para / dev / null .
Qual fluxo de saída está usando o tempo e como posso canalizá-lo para um arquivo?
Uma maneira de contornar o problema é criar um script Bash , por exemplo, combine.sh
contendo este comando:
$@ 2>&1
Então a saída de 'time' pode ser capturada da maneira correta:
combine.sh time sleep 1 &> /dev/null
(nenhuma saída é vista - correta)
Existe uma maneira de conseguir o que eu quero sem usar um script combinado separado?
2>&1 > /dev/null
significa "2 agora vai para onde 1 vai (por exemplo, o terminal, por padrão), e então 1 agora vai para / dev / null (mas 2 ainda vai para o terminal!). use>/dev/null 2>&1
para dizer "1 vai agora para / dev / null, depois 2 vai para onde 1 vai (ou seja, também para / dev / null). Isso ainda não funcionará aqui, pois o 'tempo' interno não será redirecionado, mas é mais geralmente correto (por exemplo, funcionaria se você usar / usr / bin / time). Pense em "2> & 1" como copiar a "direção" de 1 para 2, e não como 2, indo para 1