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