【问题标题】:How to suppress command output safely?如何安全地抑制命令输出?
【发布时间】:2015-12-22 09:07:06
【问题描述】:

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

下面的例子应该清楚地说明什么意思。不过,这只是一个示例-我不是在寻找针对此命令的特定解决方案,而是针对一般情况下的解决方案。遗憾的是,在许多情况下,您希望在脚本中禁止输出,但需要通过 STDIN 传递内容,而此时命令没有以其他方式提交信息的开关。

我的“问题”是我编写了一个函数来执行具有适当错误处理的命令,并且我想将执行命令产生的所有输出重定向到日志文件。

示例问题:

[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:~# 

关于如何解决我的问题的任何想法?

【问题讨论】:

  • shopt -s lastpipe 或使用进程替换,即read -p 'Test Output' TMP &>/dev/null < <(echo 'test')
  • 即使shopt -s lastpipe && echo 'test' |read -p 'Test Output' TMP &>/dev/null 也会留下一个空的$TMP。令人高兴的是,您的命令示例最终甚至可以与 &>/dev/null 一起使用,因此它是该函数的一个选项。
  • 请注意,lastpipe 选项仅适用于非交互式 shell。如果您在终端上测试它,它将无法工作
  • 啊,这就解释了为什么它不起作用。可以用一个小脚本验证功能 - 非常好的功能! :)

标签: linux bash function output


【解决方案1】:

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

  1. 避免使用子shell(上面的评论中给出了示例)
  2. 在同一个子shell中使用变量完成所有工作

    echo test | { read value; echo subshell $value; }; echo parent $value
    
  3. 使用不同的外壳

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

【讨论】:

  • @user000001 提到的 进程替换 成功了 - read -p 'Test Output' TMP < <(echo 'test') &>/dev/null 完全按照我的意愿工作。学习永不止步。 :)
  • 我刚刚意识到这在某些情况下对我没有帮助,但这与答案无关。 IE。通过我的函数将内容回显到文件时,输出完全重定向到日志。但我意识到在这种情况下将 `2>${LOGFULL} #` 放在 "${2}" 的末尾会起作用。^^
猜你喜欢
  • 2012-07-12
  • 1970-01-01
  • 2021-12-03
  • 2012-01-05
  • 2013-04-08
  • 2010-10-11
  • 2021-12-17
  • 2011-03-03
  • 1970-01-01
相关资源
最近更新 更多