如何在Bash中隐藏命令输出


100

我想让我的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 ......

如何完成这项任务?我一定会帮助使脚本更加用户友好。如果发生错误,则应向用户显示。

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


4
echo "Installing nano ......"; yum install nano &> /dev/null
user000001 2013年


Answers:


248

用这个。

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

说明

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

  • 关闭输出描述符文件,以免其接受更多输入。看起来像这样:

    your_command "Is anybody listening?" >&-

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

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

    请注意以下顺序:>&- 关闭stdout,这是您要执行的操作;&>-将stdout和stderr重定向到名为-(连字符)的文件,这不是您要执行的操作。乍一看,但后者在您的工作目录中创建了一个杂散文件。容易记住:>&2将stdout重定向到描述符2(stderr),>&3将stdout重定向到描述符3,>&-并将stdout重定向到死胡同(即,它关闭stdout)。

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

  • 将输出重定向到/dev/null,它接受所有输出并且不执行任何操作。看起来像这样:

    your_command "Hello?" > /dev/null

    为了将输出重定向到文件,您可以非常简洁地将stdout和stderr都定向到同一位置,但只能在bash中:

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

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

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

有关更多详细信息,选项和语法,请参见有关重定向bash手册


嗨,我知道这是一个老问题,但是可以有条件地做到这一点吗?就像我想在特定条件下隐藏输出?我知道我可以在if-else下复制同一部分,但是有更好的方法吗?
Usama Zafar '18

@UsamaZafar我可以通过设置一个变量(“ shell参数”)来做到这一点,您可以在脚本的前面有条件地将其设置为/dev/nullor或/dev/stdout(或/path/to/a/logfile),然后使用&> $output_dest(或任何您命名的)重定向到该目标。如果您不想在这种情况下结合使用stdout和stderr,则可以像一样分别重定向它们> $output_dest 2> $errors_dest
杰夫·鲍曼

35

您可以将stdout重定向到/ dev / null。

yum install nano > /dev/null

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

yum install nano &> /dev/null

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


23

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

通常,信息性消息会发送到sdout,错误和警报也会发送到stderr

您可以stdout通过关闭命令来关闭

MyCommand >/dev/null

stderr通过以下方式关闭:

MyCommand 2>/dev/null

如果您想同时关闭两者,则可以执行以下操作:

MyCommand 2>&1 >/dev/null

2>&1说标准错误发送到相同的地方标准输出。


8

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

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

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


1
很棒的分享
..dude

5

>/dev/null 2>&1将同时静音stdoutstderr

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

4

在这种情况下,您不应使用bash摆脱输出。百胜确实有-q抑制输出的选项。

您肯定会也想使用 -y

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

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


谢谢,我假设因为apt-get也使用-qq来抑制,所以yum也有一个。这对我的工作很有帮助。
Hyperion

0
.SILENT:

在脚本开头(不带冒号)输入“ .SILENT:”。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.