出于某种原因,似乎在以下 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
如果你运行它,输出是这样的:
stdout: rolo
stdout: stderr: cholo
有人知道为什么会这样吗?据我所知,正在发生的事情是 stderr 被发送到 stdout,这就是为什么第一行捕获第二行的输出?
最佳答案
是的——你的标准错误被发送到标准输出。这是您要求发生的事情。
您的 exec 2>>(…)
脚本正在回显到 stdout
,因此 exec >>(…)
脚本可以看到它也是——这就是为什么在 cholo
输出行上同时具有 stdout
和 stderr
标签的原因。
将脚本 (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/