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

标签 linux bash function output

通常在 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:~# 

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

最佳答案

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

  1. 避免使用子 shell(上面的评论中给出的示例)
  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
    

关于linux - 如何安全地抑制命令输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32766827/

相关文章:

linux - 每 5 秒运行一次 cURL 命令

linux - 由于删除文件系统包而无法启动 Linux

bash - 使用 verbose 和 xtrace (set -vx) 记录 bash 脚本并自定义 PS4

将数据备份到谷歌驱动器的 Bash 脚本

php - twig - 将函数传递给模板

c++ - c++中的函数返回如何工作

PHP:将 pdo_sqlsrv 日期时间列作为对象返回(Linux MSSQL 驱动程序)

linux - 如何获取路径的前两个目录

c++ - 创建自定义 shell

c - 实现这种效果的代码更少?