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

标签 linux bash shell scripting

如何暂时禁用 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/

相关文章:

linux - 仅使用 Linux Shell 编辑文件

linux命令ram类型

linux - 数据 block 和页面有什么区别?

linux - 在 R 中执行 library(package) 报告包是为 i386 构建的,它可以安装在 x86_64 系统上吗?

string - 如何在 Bash 脚本中回显 "$x_$y"?

bash - 如何通过 shell/bash 检测 386、amd64、arm 或 arm64 操作系统架构

java - 通过 teamcity 完成部署时日志卡住

linux - 编写一个 bash 脚本来删除另一个文件中的变量

linux - 如何为路径上的所有可执行文件编写 bash 完成脚本?

linux - 具有单独结果的 Bash 简单搜索脚本