我正在组建一条复杂的管道,想把stderr包含在程序输出中以便记录,但我也希望错误仍然保留在stderr中,以便我能够发现问题。
我找到了这个问题,询问如何将stdout+stderr重定向到文件中,并仍然在终端上获得stderr;它很接近,但我还不想将stdout重定向到文件:程序的输出将被其他脚本使用,因此我希望它保留在stdout(同样适用于stderr)。所以,总结一下:
- 脚本将在fd 1中产生输出,在fd 2中产生错误。 - 我希望调用程序重新排列事物,使得输出+错误显示在fd 1中,错误显示在fd 2中。 - 另外,错误应与输出交错(尽可能地进行自己的缓冲),而不是保存并添加到最后。
我找到了这个问题,询问如何将stdout+stderr重定向到文件中,并仍然在终端上获得stderr;它很接近,但我还不想将stdout重定向到文件:程序的输出将被其他脚本使用,因此我希望它保留在stdout(同样适用于stderr)。所以,总结一下:
- 脚本将在fd 1中产生输出,在fd 2中产生错误。 - 我希望调用程序重新排列事物,使得输出+错误显示在fd 1中,错误显示在fd 2中。 - 另外,错误应与输出交错(尽可能地进行自己的缓冲),而不是保存并添加到最后。
尽职调查笔记:通过2>&1
可以轻松捕获stderr。通过管道tee
,保存和查看stdout也很容易。我还知道如何将stdout重定向到文件,并通过管道引导stderr:command 2>&1 1>fileA | tee fileB
。但是我如何复制stderr并把stdout放回fd 1?
tee
子进程中使用>&1
有什么意义呢?看起来它只是将标准输出变成了标准输出的副本。 - alexis2> >(tee /dev/stderr)
正好满足了我的需求。谢谢! - alexis/dev/stderr
。 - John1024x=$(some_function | tee /dev/stderr)
并通过PIPESTATUS
来测试成功与否,但这种方法不起作用。但是通过你的解决方案,它可以正常工作。 - undefined