Tee 无法从管道获取完整输出

Tee 无法从管道获取完整输出

我有一个执行以下命令的脚本:

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"

相关内容