使用进程替换 - 仅将 stderr 发送到文件

Use process substitution - only send stderr to file

出于某种原因,似乎在以下 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 > >(…) 脚本也能看到它 — 这就是为什么您同时拥有 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> >(…) 组件内使用替代重定向。