我正在组建一个复杂的管道,我想在程序输出中包含stderr以便记录,但我也希望错误保留在stderr上,这样我就能发现问题。
我发现this question询问如何将stdout + stderr指向文件并仍在终端上获取stderr;它很接近,但我不想将stdout重定向到一个文件:程序的输出将被其他脚本使用,所以我希望它保留在stdout上(对于stderr也是如此)。所以,总结一下:
尽职调查:使用2>&1
捕获stderr很容易。通过管道tee
可以轻松保存和查看标准输出。我也知道如何将stdout转移到文件并通过管道直接stderr:command 2>&1 1>fileA | tee fileB.
但是如何复制stderr并将stdout放回到fd 1中?
答案 0 :(得分:4)
作为生成stdout和stderr的测试,让我们使用以下内容:
{ echo out; echo err >&2; }
以下代码演示了如何将stdout和stderr发送到管道中的下一步,同时还将stderr发送到终端:
$ { echo out; echo err >&2; } 2> >(tee /dev/stderr) | cat >f
err
$ cat f
out
err
2>
将stderr重定向到后面的(伪)文件。
>(tee /dev/stderr)
这是进程替换,它充当从stderr接收输入的伪文件。它接收的任何输入都被发送到tee
命令,该命令将它发送到stderr和stdout。