在shell中,如何将stdout和stderr按输出顺序组合,而stderr也分开?

问题描述 投票:1回答:1

出于构建日志记录的原因,我想要一个shell脚本结合了命令的stderr和stdout,但是也仅单独保存了stderr,因此我可以在一开始就突出显示stderr。但也可以将它们组合起来,以便在必要时进一步分析包括stdout消息。

[使用Tee和文件描述符做了很多尝试,但我不明白这一点。工作的东西。

我已经发现对于zsh,它应该可以工作cmd &> all.txt and 2> out.txt,但不幸的是,它不能在sh上运行。

我也设法一次将它们放在一个文件中,但是顺序不对,我收到所有错误,然后是标准输出或其他错误。

如果尝试尝试,应该为sh

这是我的测试脚本:

>&2 echo "error0"
echo "out0"
>&2 echo "error1"
echo "out1"
>&2 echo "error2"
echo "out2"

输出应为:

error0
out0
error1
out1
error2
out2 

和:

error0
error1
error2
shell logging stdout stderr
1个回答
0
投票
#!/bin/sh
mkfifo logpipe errpipe
tee -a errlog >logpipe <errpipe&
cat logpipe >log&
{ echo foo; echo bar >&2; } >logpipe 2>errpipe
rm logpipe errpipe

到目前为止,我可以获得dash的最佳结果(请参阅注释中的缓冲讨论):

stdbuf -e0 -o0 test.sh 2>&1 >>log | tee -a log >errlog
© www.soinside.com 2019 - 2024. All rights reserved.