如何在 Bash 中隐藏命令输出

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

我怎样才能完成这项任务?我一定会帮助使脚本更加用户友好。如果出现错误,那么它应该显示给用户。

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

291181 次浏览

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

yum install nano > /dev/null

或者重定向 stdout 和 stderr,

yum install nano &> /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失效。

用这个。

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

解释

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

  • 关闭输出描述符文件,以防止它接受更多的输入:

    your_command "Is anybody listening?" >&-
    

    通常,输出要么到文件描述符1(stdout) ,要么到文件描述符2(stderr)。如果你关闭了一个文件描述符,你必须为每一个编号的描述符这样做,因为 &>(下面)是一个特殊的 BASH 语法与 >&-不兼容:

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

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

    还要注意,有些命令可能不能很好地处理关闭的文件描述符(“ write error: Bad file description tor”) ,这就是为什么更好的解决方案可能是..。

  • 将输出重定向到 /dev/null ,它接受所有输出,不对其进行任何操作:

    your_command "Hello?" > /dev/null
    

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

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

Finally, to do the same for a number of commands at once, surround the whole thing in curly braces. Bash treats this as a group of commands, aggregating the output file descriptors so you can redirect all at once. If you're familiar instead with subshells using ( command1; command2; ) syntax, you'll find the braces behave almost exactly the same way, except that unless you involve them in a pipe the braces will not create a subshell and thus will allow you to set variables inside.

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

有关更多细节、选项和语法,请参见 Bash 重定向手册

在这种情况下,不应该使用 bash 来删除输出。百胜确实有一个取消输出的 -q选项。

您肯定也想使用 -y

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

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

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

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

一个进程通常有两个输出: Stdout(标准输出)和 真是的(标准错误)。

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

您可以通过执行以下命令来关闭 stdout

MyCommand >/dev/null

关掉 stderr:

MyCommand 2>/dev/null

如果你想要 都关掉了,你可以这样做:

MyCommand >/dev/null 2>&1

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

.SILENT:

键入“ . SILENT:”在脚本的开头不要加冒号。

你也可以把它的输出赋值给一个变量,这在你没有 /dev/null的时候特别有用。

是的,我遇到了一个情况,当我不能使用 /dev/null

我发现的解决方案是将输出分配给一个变量,这个变量在以后我再也不会使用了:

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

这个: command > /dev/null 或者这样: (也抑制错误) command > /dev/null 2>&1

与其他许多答案类似,但它们不适合我,因为 2>位于 dev/null 之前。