bash – 如何将错误输出重定向到stdout和stderr?

我正在组建一个复杂的管道,我想在程序输出中包含stderr以便记录,但我也希望错误保留在stderr上,这样我就能发现问题.

我发现this question询问如何将stdout stderr指向一个文件并仍在终端上获得stderr;它很接近,但我不想将stdout重定向一个文件:程序的输出将被其他脚本使用,所以我希望它保留在stdout上(对于stderr也是如此).所以,总结一下:

>脚本在fd 1中生成输出,在fd 2中生成错误.
>我希望调用程序重新排列事物,以便输出错误出现在fd 1中,错误出现在fd 2中.
>此外,错误应与输出交错(尽可能与自己的缓冲允许),最后不保存和添加.

尽职调查:使用2>& 1捕获stderr非常容易.通过T形管道保存和查看标准输出很容易.我也知道如何将stdout转移到文件并通过管道直接stderr:命令2>& 1 1> fileA |发球文件B.但是我如何复制stderr并将stdout放回fd 1?

作为生成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.

相关文章

用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2...
#!/bin/bashcommand1&command2&wait从Shell脚本并行...
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/ph...
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如...
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexa...
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全...