Warum geht die Ausgabe einiger Linux-Programme weder nach STDOUT noch nach STDERR?
Eigentlich möchte ich wissen, wie man zuverlässig die gesamte Programmausgabe erfasst, egal welchen "Stream" er verwendet. Das Problem, das ich habe, ist, dass einige Programme ihre Ausgabe nicht erfassen zu lassen scheinen.
Ein Beispiel ist der Befehl 'time':
time sleep 1 2>&1 > /dev/null
real 0m1.003s
user 0m0.000s
sys 0m0.000s
oder
time sleep 1 &> /dev/null
real 0m1.003s
user 0m0.000s
sys 0m0.000s
Warum wird die Ausgabe beide Male angezeigt? Ich habe erwartet, dass alles nach / dev / null geleitet wird .
Welchen Ausgabestream verwendet die Zeit und wie kann ich ihn in eine Datei leiten?
Eine Möglichkeit, das Problem zu umgehen , besteht darin, ein Bash- Skript zu erstellen , das beispielsweise den folgenden combine.sh
Befehl enthält:
$@ 2>&1
Dann kann die Ausgabe von 'time' auf die richtige Weise erfasst werden:
combine.sh time sleep 1 &> /dev/null
(keine Ausgabe wird gesehen - richtig)
Gibt es eine Möglichkeit, das zu erreichen, was ich möchte, ohne ein separates Kombinationsskript zu verwenden?
2>&1 > /dev/null
Mittel „2 geht nun an , wo 1 geht (dh das Terminal, in der Standardeinstellung), und dann 1 jetzt geht an / dev / null (aber 2 geht noch zum Terminal!) verwenden.>/dev/null 2>&1
sagen "1 geht jetzt nach / dev / null, dann geht 2 dorthin, wo 1 geht (dh auch nach / dev / null). Dies funktioniert hier immer noch nicht, da die eingebaute 'Zeit' nicht umgeleitet wird, aber im Allgemeinen korrekt ist (zum Beispiel würde es funktionieren, wenn Sie / usr / bin / time verwenden). Stellen Sie sich "2> & 1" vor, als würde die "Richtung" von 1 in 2 kopiert, nicht als "Gehe zu 1"