Mam skrypt wykonujący polecenia takie jak:
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH;./some_app -i $INDEX | tee $LOG
echo "Number of errors: $(grep "ERROR" $LOG | wc -l)"
Problem jest prawdopodobnie w potoku do tee
. Nie wydaje się, aby uzyskać całą moc wyjściową. Gdy aplikacja kończy pracę, brakuje kilku ostatnich wierszy danych wyjściowych (zwykle tych zawierających błąd krytyczny). Kiedy uruchamiam aplikację bez potoku tee
, otrzymuję je na wyjściu.
Jak zmusić skrypt do czekania, aż tee zakończy przetwarzanie wszystkich danych wyjściowych?
Odpowiedzi:
Błąd krytyczny prawdopodobnie pojawia się w STDERR (2), a nie w STDOUT (1). Możesz przekierować STDERR do STDOUT za pomocą,
2>&1
a następnie potok powinien go również przechwycić.Jeśli masz problemy z buforowaniem u góry, możesz zmusić go do stanu niebuforowanego:
źródło
Ponieważ komunikaty o błędach są zwykle wyświetlane w STDERR (deskryptor pliku 2), musisz przekierować zarówno STDOUT, jak i STDERR, aby
tee
:Gdy to zrobisz
./some_app -i $INDEX | tee $LOG
, przekierowujesz tylko STDOUT dotee
.|&
spowoduje przekierowanie STDOUT i STDERR.Jeśli nie możesz przekierować tylko STDOUT (tak jak byłeś):
Z drugiej strony, jeśli chcesz przekierować tylko STDERR:
źródło