Мишень не получает целый вывод от канала

У меня есть выполнение сценария команды как:

export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH;./some_app -i $INDEX | tee $LOG
echo "Number of errors: $(grep "ERROR" $LOG | wc -l)"

Проблема находится, вероятно, в канале к tee. Это, кажется, не получает целый вывод. Когда приложение выходит из последних нескольких строк вывода (обычно, те, которые содержат фатальную ошибку), отсутствуют. Когда я запускаю приложение без канала к tee Я получаю их в выводе.

Как я могу вынудить сценарий ожидать мишени для завершения обработки всего вывода?

10
задан 23 June 2015 в 03:22

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
20
ответ дан 23 November 2019 в 04:19

Поскольку сообщения об ошибках обычно показывают на 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"
5
ответ дан 23 November 2019 в 04:19

Другие вопросы по тегам:

Похожие вопросы: