使用进程替换 - 仅将 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 > >(…)
脚本也能看到它 — 这就是为什么您同时拥有 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 发送到 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 > >(…)
脚本也能看到它 — 这就是为什么您同时拥有 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> >(…)
组件内使用替代重定向。