我正在组建一个复杂的管道,我想在程序输出中包含stderr以便记录,但我也希望错误保留在stderr上,这样我就能发现问题 .
我找到了this question,它询问如何将stdout stderr指向一个文件并仍然在终端上获得stderr;它's close, but I don' t想要将stdout重定向到一个文件:程序's output will be consumed by other scripts, so I' d喜欢它保留在stdout上(和stderr一样) . 所以,总结一下:
-
脚本在fd 1中产生输出,在fd 2中产生错误 .
-
我希望调用程序重新排列事物,以便输出错误出现在fd 1中,错误出现在fd 2中 .
-
此外,错误应该与输出交错(尽可能与他们自己的缓冲允许),而不是保存并在最后添加 .
尽职调查:使用 2>&1
可以轻松捕获stderr . 通过 tee
管道来保存和查看标准输出很容易 . 我也知道如何将stdout转移到文件并通过管道直接stderr: command 2>&1 1>fileA | tee fileB.
但是如何复制stderr并将stdout放回fd 1?
1 回答
作为生成stdout和stderr的测试,让我们使用以下内容:
以下代码演示了如何将stdout和stderr发送到管道中的下一步,同时还将stderr发送到终端:
它是如何工作的
2>
这会将stderr重定向到后面的(伪)文件 .
>(tee /dev/stderr)
这是进程替换,它充当从stderr接收输入的伪文件 . 它接收的任何输入都被发送到
tee
命令,该命令将它发送到stderr和stdout .