【问题标题】:How to hide command output in Bash如何在 Bash 中隐藏命令输出
【发布时间】:2013-08-06 10:22:56
【问题描述】:

我想让我的 Bash 脚本对最终用户来说更优雅。如何在 Bash 执行命令时隐藏输出?

例如,当 Bash 执行时

yum install nano

执行 Bash 的用户会看到以下内容:

Loaded plugins: fastestmirror
base                                                     | 3.7 kB     00:00
base/primary_db                                          | 4.4 MB     00:03
extras                                                   | 3.4 kB     00:00
extras/primary_db                                        |  18 kB     00:00
updates                                                  | 3.4 kB     00:00
updates/primary_db                                       | 3.8 MB     00:02
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package nano.x86_64 0:2.0.9-7.el6 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
 Package         Arch              Version                Repository       Size
================================================================================
Installing:
 nano            x86_64            2.0.9-7.el6            base            436 k

Transaction Summary
================================================================================
Install       1 Package(s)

Total download size: 436 k
Installed size: 1.5 M
Downloading Packages:
nano-2.0.9-7.el6.x86_64.rpm                              | 436 kB     00:00
warning: rpmts_HdrFromFdno: Header V3 RSA/SHA256 Signature, key ID c105b9de: NOKEY
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
Importing GPG key 0xC105B9DE:
 Userid : CentOS-6 Key (CentOS 6 Official Signing Key) <centos-6-key@centos.org>
 Package: centos-release-6-4.el6.centos.10.x86_64 (@anaconda-CentOS-201303020151.x86_64/6.4)
 From   : /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing : nano-2.0.9-7.el6.x86_64                                      1/1
  Verifying  : nano-2.0.9-7.el6.x86_64                                      1/1

Installed:
  nano.x86_64 0:2.0.9-7.el6

Complete!

现在我想对用户隐藏它,而是显示:

    Installing nano ......

我怎样才能完成这项任务?我一定会帮助使脚本更加用户友好。如果发生错误,则应将其显示给用户。

我想知道在执行一组命令时如何显示相同的消息。

【问题讨论】:

标签: bash shell


【解决方案1】:

使用这个。

{
  /your/first/command
  /your/second/command
} &> /dev/null

说明

要消除命令的输出,您有两种选择:

  • 关闭输出描述符文件,使其不再接受任何输入。看起来像这样:

    your_command "Is anybody listening?" >&-
    

    通常,输出到文件描述符 1 (stdout) 或 2 (stderr)。如果您关闭文件描述符,则必须对每个编号的描述符都这样做,因为&amp;&gt;(下)是与&gt;&amp;- 不兼容的特殊 BASH 语法:

    /your/first/command >&- 2>&-
    

    注意顺序:&gt;&amp;-closes stdout,就是你想做的; &amp;&gt;- 将 stdout 和 stderr 重定向到名为 -(连字符)的文件,这不是您想要做的。一开始看起来是一样的,但后者会在你的工作目录中创建一个杂散文件。很容易记住:&gt;&amp;2 将标准输出重定向到描述符 2(stderr),&gt;&amp;3 将标准输出重定向到描述符 3,&gt;&amp;- 将标准输出重定向到死胡同(即它关闭标准输出)。

    还要注意,某些命令可能无法特别好地处理关闭的文件描述符(“写入错误:错误的文件描述符”),这就是为什么更好的解决方案可能是...

  • Redirect output to /dev/null,它接受所有输出并且不做任何事情。它看起来像这样:

    your_command "Hello?" > /dev/null
    

    对于输出重定向到文件,您可以非常简洁地将 stdout 和 stderr 定向到同一个地方,但只能在 bash 中:

    /your/first/command &> /dev/null
    

最后,要同时对多个命令执行相同的操作,请将整个内容用花括号括起来。 Bash 将其视为a group of commands,聚合输出文件描述符,以便您可以一次全部重定向。如果您熟悉使用( command1; command2; ) 语法的子shell,您会发现大括号的行为几乎完全相同,除非您将它们包含在管道中,否则大括号不会创建子shell,因此您可以设置里面的变量。

{
  /your/first/command
  /your/second/command
} &> /dev/null

有关更多详细信息、选项和语法,请参阅bash manual on redirections

【讨论】:

  • 嗨,我知道这是一个老问题,但可以有条件地做同样的事情吗?就像我想在特定条件下隐藏输出?我知道我可以在 if-else 下复制相同的部分,但有更好的方法吗?
  • @UsamaZafar 我会通过设置一个变量 ("shell parameter") 来做到这一点,您可以在脚本的前面有条件地将其设置为 /dev/null/dev/stdout(或 /path/to/a/logfile),然后使用&amp;&gt; $output_dest(或任何您命名的名称)重定向到该目的地。如果您不想在这种情况下合并 stdout 和 stderr,您可以像 &gt; $output_dest 2&gt; $errors_dest 一样单独重定向它们。
  • 我不知道这是大括号的用途。
【解决方案2】:

您可以将标准输出重定向到 /dev/null。

yum install nano &gt; /dev/null

或者你可以同时重定向stdout和stderr,

yum install nano &amp;&gt; /dev/null.

但如果程序有一个安静的选项,那就更好了。

【讨论】:

    【解决方案3】:

    一个进程通常有两个输出要筛选:stdout(标准输出)和stderr(标准错误)。

    通常情况下,信息性消息发送到sdout,错误和警报发送到stderr

    您可以通过以下方式关闭命令的stdout

    MyCommand >/dev/null
    

    然后关闭stderr

    MyCommand 2>/dev/null
    

    如果您希望两者都关闭,您可以这样做:

    MyCommand 2>&1 >/dev/null
    

    2&gt;&amp;1 表示将 stderr 发送到与 stdout 相同的位置。

    【讨论】:

      【解决方案4】:

      您可以将输出重定向到/dev/null。有关 /dev/null 的更多信息,请阅读此link

      您可以通过以下方式隐藏命令的输出:

      echo -n "Installing nano ......"; yum install nano > /dev/null; echo " done."; 
      

      将标准输出重定向到/dev/null,而不是标准错误。这将显示安装过程中发生的错误,例如如果yum 找不到包。

      echo -n "Installing nano ......"; yum install nano &> /dev/null; echo " done.";
      

      虽然此代码不会在终端中显示任何内容,因为标准错误和标准输出都被重定向并因此无效到/dev/null

      【讨论】:

      • 很好的分享....dude,你能告诉我如何为一组命令只输出一次相同的消息
      【解决方案5】:

      &gt;/dev/null 2&gt;&amp;1 将静音 stdoutstderr

      yum install nano >/dev/null 2>&1
      

      【讨论】:

        【解决方案6】:

        在这种情况下,您不应该使用 bash 来消除输出。 Yum 确实有一个选项 -q 可以抑制输出。

        你肯定也想使用-y

        echo "Installing nano..."
        yum -y -q install nano
        

        要查看 yum 的所有选项,请使用 man yum

        【讨论】:

        • 谢谢,我认为 yum 有一个,因为 apt-get 也使用 -qq 来抑制。这对我正在做的事情很有帮助。
        【解决方案7】:
        .SILENT:
        

        在脚本开头键入“.SILENT:”,不带冒号。

        【讨论】:

          【解决方案8】:

          您也可以通过将其输出分配给一个变量来做到这一点,这在您没有/dev/null 时特别有用。

          是的,我遇到了无法使用/dev/null 的情况。

          我找到的解决方案是将输出分配给我以后永远不会使用的变量:

          hide_output=$([[ -d /proc ]] && [[ mountpoint -q /proc ]] && umount -l /proc)
          

          【讨论】:

            猜你喜欢
            • 2015-05-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-10-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-06-04
            相关资源
            最近更新 更多