如何同步记录stderr和stdout,但只将stderr打印到屏幕?

时间:2011-04-21 13:43:46

标签: bash shell stdout stderr

这是我经常尝试做的任务。 我想将stderr和stdout都记录到日志文件中。但我只想打印到控制台stderr。

我尝试过使用tee,但是一旦我使用“2>& 1”合并了stderr和stdout。我不能再将stdout打印到屏幕上,因为我的管道都已合并。

以下是我尝试过的一个简单示例

./ dosomething.sh | tee -a log 2>& 1。 现在我在日志和屏幕上都有stderr和stdout。

任何想法?

根据本网站上的一些内容,已经提出了这个问题。 Write STDOUT & STDERR to a logfile, also write STDERR to screen

这里也有一个非常相似的问题: Save stdout, stderr and stdout+stderr synchronously

但是当stdoud和stderr同步写入日志文件时,它们都无法将stdout + stderr重定向到日志和stderr到屏幕。

2 个答案:

答案 0 :(得分:5)

我能够在bash中使用它:

(./tmp.sh 2> >(tee >(cat >&2) >&1)) > tmp.log

这在zsh中无法正常工作(提示不等待进程退出),并且在dash中根本不起作用。一个更便携的解决方案可能是编写一个简单的C程序来完成它。

答案 1 :(得分:1)

我设法在bash中使用此脚本。

mkfifo stdout 
mkfifo stderr 

rm -f out 
cat stderr | tee -a out & 
cat stdout >> out & 
(echo "stdout";  
 grep;  
 echo "an other stdout";  
 echo "again stdout";  
 stat) 2> stderr > stdout 

rm -f stdout 
rm -f stderr

保留输出的顺序。使用此脚本,过程正确结束。

注意:我使用不带参数的grep和stat来生成stdout。