У меня есть выполнение сценария команды как:
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH;./some_app -i $INDEX | tee $LOG
echo "Number of errors: $(grep "ERROR" $LOG | wc -l)"
Проблема находится, вероятно, в канале к tee
. Это, кажется, не получает целый вывод. Когда приложение выходит из последних нескольких строк вывода (обычно, те, которые содержат фатальную ошибку), отсутствуют. Когда я запускаю приложение без канала к tee
Я получаю их в выводе.
Как я могу вынудить сценарий ожидать мишени для завершения обработки всего вывода?
Фатальная ошибка, вероятно, выходит в 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"