Perché l'output di alcuni programmi Linux non arriva né a STDOUT né a STDERR?
In realtà, voglio sapere come acquisire in modo affidabile tutto l'output del programma, indipendentemente dal "flusso" che utilizza. Il problema che ho è che alcuni programmi non sembrano catturare il loro output.
Un esempio è il comando 'time':
time sleep 1 2>&1 > /dev/null
real 0m1.003s
user 0m0.000s
sys 0m0.000s
o
time sleep 1 &> /dev/null
real 0m1.003s
user 0m0.000s
sys 0m0.000s
Perché vedo l'output entrambe le volte? Mi aspettavo che tutto fosse convogliato in / dev / null .
Quale flusso di output utilizza il tempo e come posso inserirlo in un file?
Un modo per aggirare il problema è creare uno script Bash , ad esempio, combine.sh
contenente questo comando:
$@ 2>&1
Quindi l'output di 'time' può essere catturato nel modo corretto:
combine.sh time sleep 1 &> /dev/null
(non viene visualizzato alcun output - corretto)
C'è un modo per ottenere ciò che voglio senza usare uno script di combinazione separato?
2>&1 > /dev/null
significa "2 ora va dove 1 va (cioè, il terminale, di default), e poi 1 ora va a / dev / null (ma 2 va ancora al terminale!). usa>/dev/null 2>&1
per dire "1 ora passa a / dev / null, quindi 2 va dove 1 va (cioè anche a / dev / null). Questo non funzionerà ancora qui poiché il 'tempo' incorporato non verrà reindirizzato, ma è generalmente più corretto (ad esempio funzionerebbe se usi / usr / bin / time). Pensa a "2> & 1" come copiando la "direzione" di 1 in 2, non come 2 andando a 1