由于某些原因,似乎在以下bash脚本中将stderr发送到stdout:

exec > >( while read line; do echo " stdout: $line"; done )
exec 2> >( while read line; do echo " stderr: $line"; done )

echo "rolo"
echo "cholo" >&2

如果运行该命令,则输出为:



有人知道为什么会这样吗?据我所知,发生的事情是stderr被发送到stdout,这就是为什么第一行捕获第二行的输出的原因?

最佳答案

是的-您的标准错误正在发送到标准输出。这就是你要求发生的事情。

您的exec 2> >(…)脚本正在响应stdout,因此exec > >(…)脚本也可以看到它-这就是为什么stdout输出行上同时具有stderrcholo标记的原因。

将您的脚本(bash17.sh)修改为:

exec  > >( while read line; do echo " stdout: $line"; done     )
exec 2> >( while read line; do echo " stderr: $line"; done >&2 )

echo "rolo"
echo "cholo" >&2

这样,标准错误就变成了标准错误,您会看到:
$ bash bash17.sh
 stdout: rolo
 stderr: cholo
$ bash bash17.sh > /dev/null
 stderr: cholo
$ bash bash17.sh 2> /dev/null
 stdout: rolo
$

显然,要获取文件的标准错误,您可以在脚本的exec 2> >(…)组件内使用替代重定向。

关于bash - 使用进程替换-仅将stderr发送到文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50226149/

10-16 23:48