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

Bash 如何同步记录stderr和stdout,但仅将stderr打印到屏幕?,bash,shell,stdout,stderr,Bash,Shell,Stdout,Stderr,这是我经常尝试做的一项任务。 我想将stderr和stdout都记录到一个日志文件中。但我只想打印到控制台stderr 我尝试过使用tee,但一旦我使用“2>&1”合并了stderr和stdout。我无法再将标准输出打印到屏幕上,因为我的两个管道都已合并 这是一个简单的例子,我尝试了 ./dosomething.sh | tee-a log 2>&1。 现在我有了日志和屏幕上的stderr和stdout 有什么想法吗 根据本网站上的一些阅读,有人提出了这个问题。 这里还有一个非常类似的问题:

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

我尝试过使用tee,但一旦我使用“2>&1”合并了stderr和stdout。我无法再将标准输出打印到屏幕上,因为我的两个管道都已合并

这是一个简单的例子,我尝试了

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

有什么想法吗

根据本网站上的一些阅读,有人提出了这个问题。

这里还有一个非常类似的问题:


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

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

这在zsh中无法正常工作(提示不会等待进程退出),在dash中根本无法工作。一个更具可移植性的解决方案可能是编写一个简单的C程序来实现这一点。

我在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。

@Tomalak OP尝试了
tee
2>&1
。他缺少什么吗?@chrisaycock:他使用的命令。正是。我把这个问题编辑得更精确一点。给出一个例子并参考关于堆栈溢出的现有问题,我认为
dash
和其他简单的、类似POSIX的shell根本无法表达这一点+1,似乎有效。当我使用此功能时,我需要按enter键返回提示。键入一个命令,然后输入,将运行该命令。有什么办法可以避免这种情况吗?接受的解决方案(来自Random832)确实会在后台执行。请参见此处,该命令不按正确顺序打印。$回波线;((echo line2;grep)2>>(tee>(cat>&2)>&1))>tmp.log;echo line3 line3$用法:grep[选项]。。。模式[文件]。。。有关详细信息,请尝试“grep--help”。