如何暂时禁用 bash 脚本中的 stdout 或 stderr?
当然,最常见的方法是将 stdout 或 stderr 重定向到/dev/null。
但在某些系统上/dev/null 对于普通用户来说可能是不可写的。
我正在编写一些旨在可移植的脚本,因此我不喜欢使用/dev/null
一些博客/帖子说 >&- 可以关闭标准输出,但是当我在 bash 终端中尝试 echo 123 >&- 时,它只是失败并显示消息“bash: echo: write error: Bad file detector”
当然,我可以通过将 stdout 或 stderr 重定向到 tmp 文件来做到这一点,如下所示:
some_command >/tmp/null
但我想要的是更“优雅”的方式
我想也许我可以通过使用这样的管道来实现这一点:
some_command | :
但这样一来,可能会“污染”原命令的退出码
最佳答案
这是一种实现您想要的功能的可能方法:
( my_cmd 3>&1 1>&2 2>&3- ) | :
这会暂时将 stdout
发送到新文件句柄 3
并将 stderr
重定向到 stdout
,以便 stderr
通过管道传输到命令(在本例中为 :
)。然后新的文件句柄被路由回 stdout。这些避免将 my_cmd
的 stdout
通过管道传输到 :
中。中的 -
在使用后关闭句柄。
要在上述操作之后检查 my_cmd
的存在状态,请检查环境变量 $PIPESTATUS[0]
。 $PIPESTATUS
是一个 bash
环境数组变量,它保存最后完成的管道中每个管道命令的退出状态。
我认为真正正确的答案是调查为什么 /dev/null
不是全局可写的。否则,系统配置不符合标准,可能会导致系统问题。相比之下,上述解决方法有点困惑。
关于linux - 当/dev/null对普通用户不可写时如何重定向stdout/stderr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23844396/