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

标签 bash shell io-redirection process-substitution

出于某种原因,似乎在以下 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 >>(…) 脚本可以看到它也是——这就是为什么在 cholo 输出行上同时具有 stdoutstderr 标签的原因。

将脚本 (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/

相关文章:

linux - 你如何区分一个目录只包含特定类型的文件?

bash - 如何将命令结果存储在 shell 变量中?

linux - 如何在多个命令中优先选择一个命令

linux - Shell - 更改文件名而不更改给定路径的扩展名

linux - 如何删除正在连续写入的文件的旧内容?

C 编程 - freopen 附加一个 ?到文件名

c++ - 获取通过重定向传递的输入文件的名称?

bash - 遍历并替换数组中的元素

bash - 如何将变量设置为 Bash 中命令的输出?

c - 在我自己的简单 shell 中进行管道传输和重定向