Tee 没有从管道中获得全部输出

Lad*_*nka 15 command-line bash scripts pipe tee

我有一个脚本执行命令,如:

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

问题可能出在到tee. 它似乎没有得到整个输出。当应用程序退出时,输出的最后几行(通常是那些包含致命错误的)丢失了。当我在没有管道的情况下运行应用程序时,tee我将它们放入输出中。

如何强制脚本等待 tee 完成所有输出的处理?

Oli*_*Oli 26

致命错误可能出现在 STDERR (2) 中,而不是 STDOUT (1)。您可以将 STDERR 重定向到 STDOUT,2>&1然后管道也应该捕获它。

./some_app -i $INDEX 2>&1 | tee $LOG
Run Code Online (Sandbox Code Playgroud)

如果你有缓冲问题,你可以强制它进入无缓冲状态:

stdbuf -o0 ./some_app -i $INDEX 2>&1 | tee $LOG
Run Code Online (Sandbox Code Playgroud)


hee*_*ayl 7

由于错误消息通常显示在 STDERR(文件描述符 2)上,您需要将 STDOUT 和 STDERR 重定向到tee

./some_app -i "$INDEX" |& tee "$LOG"
Run Code Online (Sandbox Code Playgroud)

当您这样做时,./some_app -i $INDEX | tee $LOG您只是将 STDOUT 重定向到tee.

|& 将导致 STDOUT 和 STDERR 都被重定向。

如果您不能仅重定向 STDOUT(就像您一样):

./some_app -i "$INDEX" | tee "$LOG"
Run Code Online (Sandbox Code Playgroud)

另一方面,如果您只想重定向 STDERR:

./some_app -i "$INDEX" 2>&1 >/dev/null | tee "$LOG"
Run Code Online (Sandbox Code Playgroud)