bash - 如何在 Bash 中隐藏命令输出

标签 bash shell

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

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

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

最佳答案

使用这个。

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

说明

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

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

    your_command "Is anybody listening?" >&-
    

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

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

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

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

  • 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了解更多详细信息、选项和语法。

关于bash - 如何在 Bash 中隐藏命令输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18062778/

相关文章:

shell - 通过SSH执行大量命令

linux - Linux 脚本中 while/case 语句的问题

python - BASH 和 Python

python - 如何使用 "less"禁用 Python shell 生成 "help"

python |更改 shell 中的文本颜色

bash - 如何在终端(一个 liner sed)中每 n 个字符向大文件添加一个新行?

string - 从分隔的拆分字符串中删除所有子字符串匹配的高效/安全 shell 脚本?

bash - 如何从文件夹中删除除少数文件夹之外的所有文件/文件夹?

bash - bash 命令 "rm *~"有什么作用?

bash - 替换同一行上模式范围之间的文本