5

出于某种原因,似乎 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

如果你运行它,输出是这样的:

标准输出:rolo
标准输出:标准错误:cholo

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

4

1 回答 1

5

是的——你的标准错误被发送到标准输出。这是你要求发生的事情。

您的exec 2> >(…)脚本正在回显到stdout,因此exec > >(…)脚本也可以看到它——这就是为什么您在输出行上同时具有stdoutstderr标记的原因。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> >(…)在脚本组件内使用替代重定向。

于 2018-05-08T05:20:48.797 回答