gpt4 book ai didi

linux - 当/dev/null对普通用户不可写时如何重定向stdout/stderr

转载 作者:太空宇宙 更新时间:2023-11-04 05:29:46 26 4
gpt4 key购买 nike

如何暂时禁用 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_cmdstdout 通过管道传输到 : 中。中的 - 在使用后关闭句柄。

要在上述操作之后检查 my_cmd 的存在状态,请检查环境变量 $PIPESTATUS[0]$PIPESTATUS 是一个 bash 环境数组变量,它保存最后完成的管道中每个管道命令的退出状态。

我认为真正正确的答案是调查为什么 /dev/null 不是全局可写的。否则,系统配置不符合标准,可能会导致系统问题。相比之下,上述解决方法有点困惑。

关于linux - 当/dev/null对普通用户不可写时如何重定向stdout/stderr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23844396/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com