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)
由于错误消息通常显示在 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)