这是我经常尝试做的任务。 我想将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到屏幕。
答案 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。