Ich habe ein Skript, das Befehle ausführt wie:
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH;./some_app -i $INDEX | tee $LOG
echo "Number of errors: $(grep "ERROR" $LOG | wc -l)"
Das Problem liegt wohl in der Leitung zu tee
. Es scheint nicht die gesamte Ausgabe zu erhalten. Wenn die Anwendung beendet wird, fehlen die letzten Zeilen der Ausgabe (normalerweise diejenigen, die einen schwerwiegenden Fehler enthalten). Wenn ich die App ohne Pipe starte, tee
bekomme ich sie in die Ausgabe.
Wie kann ich das Skript zwingen, auf den Abschlag zu warten, um die Verarbeitung aller Ausgaben abzuschließen?
Antworten:
Der schwerwiegende Fehler tritt wahrscheinlich in STDERR (2) und nicht in STDOUT (1) auf. Sie können STDERR mit in STDOUT umleiten,
2>&1
und dann sollte das Rohr es auch erfassen.Wenn Sie oben Probleme mit der Pufferung haben, können Sie diese in einen ungepufferten Zustand versetzen:
quelle
Da die Fehlermeldungen normalerweise in STDERR (Dateideskriptor 2) angezeigt werden, müssen Sie sowohl STDOUT als auch STDERR umleiten zu
tee
:Wenn Sie dies tun
./some_app -i $INDEX | tee $LOG
, leiten Sie den STDOUT nur an weitertee
.|&
bewirkt, dass sowohl STDOUT als auch STDERR umgeleitet werden.Wenn Sie nicht nur das STDOUT umleiten können (wie Sie waren):
Wenn Sie jedoch nur den STDERR umleiten möchten:
quelle