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