由于某些原因,似乎在以下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
输出行上同时具有stderr
和cholo
标记的原因。
将您的脚本(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/