我想让最终用户的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 ......
我怎样才能完成这项任务。我一定会帮助使脚本更加用户友好。如果发生错误,应该向用户显示。
编辑我想知道在执行一组命令时如何显示相同的消息
答案 0 :(得分:216)
{
/your/first/command
/your/second/command
} &> /dev/null
要消除命令的输出,您有两个选择:
关闭输出描述符文件,使其不再接受任何输入。看起来像这样:
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)。 / p>
还要注意某些命令可能无法很好地处理关闭的文件描述符(“写入错误:错误的文件描述符”),这就是为什么更好的解决方案可能是...
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。
答案 1 :(得分:31)
您可以将stdout重定向到/ dev / null。
yum install nano > /dev/null
或者你可以重定向stdout和stderr,
yum install nano &> /dev/null
。
但是如果程序有一个安静的选项,那就更好了。
答案 2 :(得分:10)
进程通常有两个屏幕输出:标准输出(标准输出)和标准输出(标准错误)。
正常情况下,信息性消息会转到sdout
,错误和提醒会转到stderr
。
您可以通过执行
关闭命令的stdout
MyCommand >/dev/null
并执行以下操作关闭stderr
:
MyCommand 2>/dev/null
如果你想要关闭,你可以这样做:
MyCommand 2>&1 >/dev/null
2>&1
表示将stderr发送到与stdout相同的位置。
答案 3 :(得分:6)
您可以将输出重定向到/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
。
答案 4 :(得分:4)
在这种情况下,你不应该使用bash来摆脱输出。 Yum有一个选项-q
,它会抑制输出。
您肯定也想使用-y
echo "Installing nano..."
yum -y -q install nano
要查看yum的所有选项,请使用man yum
。
答案 5 :(得分:4)
>/dev/null 2>&1
会将stdout
和stderr
yum install nano >/dev/null 2>&1
答案 6 :(得分:0)
您也可以通过将其输出分配给变量来实现,这在您没有 /dev/null
时特别有用。
是的,我遇到过无法使用 /dev/null
的情况。
我找到的解决方案是将输出分配给一个变量,此后我将永远不会在那里使用该变量:
hide_output=$([[ -d /proc ]] && [[ mountpoint -q /proc ]] && umount -l /proc)
答案 7 :(得分:-1)
.SILENT:
在没有冒号的脚本开头输入“.SILENT:”。