5 bash shell io-redirection process-substitution
出于某种原因,似乎stderr在以下bash脚本中被发送到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
Run Code Online (Sandbox Code Playgroud)
如果你运行它,输出是这样的:
stdout:rolo
stdout:stderr:cholo
有谁知道为什么会这样?据我所知,发生的事情是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
Run Code Online (Sandbox Code Playgroud)
所以标准错误转到标准错误,你看到:
$ bash bash17.sh
stdout: rolo
stderr: cholo
$ bash bash17.sh > /dev/null
stderr: cholo
$ bash bash17.sh 2> /dev/null
stdout: rolo
$
Run Code Online (Sandbox Code Playgroud)
显然,要将标准错误传递给文件,您可以exec 2> >(…)在脚本组件内部使用备用重定向.