如何使用Bash抑制命令的所有输出?
我有一个Bash脚本,它运行一个带有参数的程序。该程序输出一些状态(做这个,做那个…)。这个程序没有任何安静的选项。如何防止脚本显示任何内容如何使用Bash抑制命令的所有输出?,bash,shell,scripting,echo,Bash,Shell,Scripting,Echo,我有一个Bash脚本,它运行一个带有参数的程序。该程序输出一些状态(做这个,做那个…)。这个程序没有任何安静的选项。如何防止脚本显示任何内容 我正在寻找类似Windows的东西。以下命令将标准输出发送到空设备(位存储桶) 如果您还希望在那里发送错误消息,请使用其中一种(第一种可能不适用于所有shell): 并且,如果您想记录消息,但看不到它们,请用实际文件替换/dev/null,例如: scriptname &>scriptname.out 为完整起见,在Windows cmd.
我正在寻找类似Windows的东西。以下命令将标准输出发送到空设备(位存储桶) 如果您还希望在那里发送错误消息,请使用其中一种(第一种可能不适用于所有shell): 并且,如果您想记录消息,但看不到它们,请用实际文件替换
/dev/null
,例如:
scriptname &>scriptname.out
为完整起见,在Windows cmd.exe下(其中“nul”相当于“/dev/null”),它是:
差不多
script > /dev/null 2>&1
这将阻止标准输出和错误输出,并将它们重定向到/dev/null
类似,请使用此选项(如果您在Unix环境中工作):
或者您可以使用此选项(如果您在Windows环境中工作):
这是另一种选择
scriptname |& :
试一试
:
是“什么都不做”的缩写
$()
只是您的命令。在某些情况下,可以选择将命令的结果分配给变量:
$ DUMMY=$( grep root /etc/passwd 2>&1 )
$ echo $?
0
$ DUMMY=$( grep r00t /etc/passwd 2>&1 )
$ echo $?
1
由于BASH和其他POSIX命令行解释器不考虑变量赋值作为命令,因此当前命令的返回代码受到尊重。
注意:带有排版
或declare
关键字的赋值被视为一个命令,因此在case中计算的返回码是赋值本身,而不是在子shell中执行的命令:
$ declare DUMMY=$( grep r00t /etc/passwd 2>&1 )
$ echo $?
0
请看中的示例: 3.6示例:stderr和stdout 2文件 这将把程序的每个输出放在一个文件中。如果您希望命令以绝对静默的方式传递,这有时适用于cron条目
rm -f $(find / -name core) &> /dev/null
也就是说,您可以使用以下简单重定向:
/path/to/command &>/dev/null
在脚本中,您可以将以下内容添加到要给出输出的行中:
some_code 2>>/dev/null
或者你也可以试试
some_code >>/dev/null
如果您想保存一些输入,也可以使用&>来实现;)即使我将其添加到我的gs(GhostScript)命令中,它仍会打印出****警告:文件有一个损坏的%%EOF标记,或者%%EOF后有垃圾。有什么建议吗?这不会在unix系统上运行该进程,我必须执行
2>/dev/null
您实际上可以比在Windows shell中做得更好。如果改为使用“scriptname>nul”,则您甚至不会删除任何文件,因为“nul”是Windows中与/dev/null等效的文件。@andynormancx:这就是我讨厌Windows文件系统布局的原因。它“保留”了NUL、COM1、LPT1、CON等文件名,不管你在哪个目录下(即使你在一个可以拥有这些文件名的文件系统中,比如在网络共享中)。我想我从DOS 5.x开始就没有使用过NUL,当我看到这个答案时,我突然想起了;)如果您在带有cygwin或git bash的Windows上使用了>nul
,而现在您被一个无法删除的nul
文件卡住了,请尝试一下,它工作起来很有魅力;Korn和Bourne shell需要2>/dev/null或2>&1(将stderr发送到与stdout相同的位置)。Korn shell似乎将“&>”解释为“在后台运行东西,然后在空命令上执行i/o重定向”。请注意,有些命令直接写入终端设备,而不是标准输出/错误。要进行测试,请将echo foo>$(tty)
放入脚本中,然后运行/test.sh&>/dev/null
-输出仍然打印到终端。当然,如果您正在编写一个不使用此类命令的脚本,这不是问题。@l0b0,是否有办法使脚本(或任何其他程序)的tty不同,以便不管您的示例如何,都重定向所有输出?我知道screen和script可以做类似的事情,但它们都很挑剔,并且从*nix到*nix都不一样。@yang/dev/null
存在于Cygwin中,您不需要使用nul
。非常有趣,但有一个限制:返回的状态代码总是0
(成功)。让我们看一个使用总是返回1
(失败)的命令false
的示例。例如(echo foo | tee file;false)&&echo条
显示foo
。使用您的技巧抑制输出:(:$(echo foo | tee file;false))&&echo bar
。但它会显示条
,表示返回状态代码为0
(这不是false
中返回的状态代码)。请提供此限制更新您的答案。Cheers@olibre,那么DUMMY=$(yourcommand)
呢?它没有您提到的限制。:)@semente Perfect:命令DUMMY=$(echo foo | tee file;false)和&echo bar
不显示任何内容。命令DUMMY=$(echo foo | tee file;true)和&echo bar
显示bar
。请告知我您是否提供了投票的答案;-)Cheers从未将>>转到/dev/null。。出于好奇。。为什么要这样做?它会抑制所有输出吗?为什么要使用双“>”(>
)?使用>>为null是不必要的,也有点不正确,但在这种情况下是无害的。考虑到它不需要在内存中缓冲命令的输出,我认为这可能是最好的方法。
$ DUMMY=$( grep root /etc/passwd 2>&1 )
$ echo $?
0
$ DUMMY=$( grep r00t /etc/passwd 2>&1 )
$ echo $?
1
$ declare DUMMY=$( grep r00t /etc/passwd 2>&1 )
$ echo $?
0
rm -f $(find / -name core) &> /dev/null
/path/to/command &>/dev/null
some_code 2>>/dev/null
some_code >>/dev/null