如何安全地抑制命令输出?

How to suppress command output safely?

通常在 unix 系统上,您可以通过将 STDIN and/or STDERR 重定向到文件或 /dev/null 来抑制命令输出。但是,如果您需要在 bash 脚本中通过 STDIN 将内容传递给管道命令怎么办?

下面的例子应该能说明什么意思。不过,这只是一个例子——我不是在具体地寻找这个命令的解决方案,而是在一般情况下寻找这种情况的解决方案。遗憾的是,在许多情况下,您希望抑制脚本中的输出,但需要通过 STDIN 传递内容,而命令没有开关以其他方式提交信息。

我的 "problem" 是我编写了一个函数来执行命令并进行适当的错误处理,我想在其中将执行命令产生的所有输出重定向到日志文件。

示例问题:

[18:25:35] [V] root@vbox:~# echo 'test' |read -p 'Test Output' TMP &>/dev/null 
[18:25:36] [V] root@vbox:~# echo $TMP

[18:25:36] [V] root@vbox:~# 

关于如何解决我的问题有什么想法吗?

user000001 所说的是 bash 管道中的所有命令都在子 shell 中执行。因此,当处理 read 命令的 subshell 退出时,$TMP 变量也会消失。您必须考虑到这一点,并且:

  1. 避免 subshells(上面评论中给出的例子)
  2. 在同一子shell

    中使用变量完成所有工作
    echo test | { read value; echo subshell $value; }; echo parent $value
    
  3. 使用不同的shell

    $ ksh -c 'echo test | { read value; echo subshell $value; }; echo parent $value'
    subshell test
    parent test