我有一个执行以下命令的脚本:
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH;./some_app -i $INDEX | tee $LOG
echo "Number of errors: $(grep "ERROR" $LOG | wc -l)"
问题可能出在管道中tee
。它似乎没有获得整个输出。当应用程序退出时,输出的最后几行(通常包含致命错误)会丢失。当我运行没有管道的应用程序时,tee
我会在输出中得到它们。
我如何强制脚本等待 tee 完成所有输出的处理?
答案1
致命错误可能出现在 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
答案2
由于错误消息通常显示在 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"