Тройник не получает всю продукцию из трубы
У меня есть скрипт, выполняющий команды, такие как:
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH;./some_app -i $INDEX | tee $LOG
echo "Number of errors: $(grep "ERROR" $LOG | wc -l)"
Проблема, вероятно, в трубе tee
, Похоже, не получить весь вывод. Когда приложение завершает работу, последние несколько строк вывода (обычно те, которые содержат фатальную ошибку) отсутствуют. Когда я запускаю приложение без трубы tee
Я получаю их в выходной.
Как я могу заставить скрипт ждать, пока тройник завершит обработку всего вывода?
2 ответа
Вероятно, фатальная ошибка возникает в STDERR (2), а не в STDOUT (1). Вы можете перенаправить STDERR в STDOUT с помощью 2>&1
и тогда труба должна захватить его тоже.
./some_app -i $INDEX 2>&1 | tee $LOG
Если у вас есть проблемы с буферизацией, вы можете перевести ее в состояние без буферизации:
stdbuf -o0 ./some_app -i $INDEX 2>&1 | tee $LOG
Поскольку сообщения об ошибках обычно отображаются в STDERR (дескриптор файла 2), вам нужно перенаправить STDOUT и STDERR в tee
:
./some_app -i "$INDEX" |& tee "$LOG"
Когда вы делаете ./some_app -i $INDEX | tee $LOG
вы только перенаправляете STDOUT на tee
,
|&
приведет к перенаправлению как STDOUT, так и STDERR.
Если вы не можете перенаправить только STDOUT (как вы были):
./some_app -i "$INDEX" | tee "$LOG"
С другой стороны, если вы хотите перенаправить только STDERR:
./some_app -i "$INDEX" 2>&1 >/dev/null | tee "$LOG"