如何使用Bash禁止命令的所有输出?


296

我有一个Bash脚本,该脚本运行带有参数的程序。该程序输出一些状态(执行此操作,执行此操作...)。这个程序没有任何选择可以安静。如何防止脚本显示任何内容?

我正在寻找Windows的“ echo off”之类的东西

Answers:


510

以下命令将标准输出发送到空设备(位存储桶)。

scriptname >/dev/null

而且,如果您还希望将错误消息发送到那里,请使用以下命令之一(第一个消息可能不适用于所有shell):

scriptname &>/dev/null
scriptname >/dev/null 2>&1
scriptname >/dev/null 2>/dev/null

并且,如果您想记录消息但看不到消息,请替换/dev/null为实际文件,例如:

scriptname &>scriptname.out

为了完整起见,在Windows cmd.exe(其中“ nul”等效于“ / dev / null”)下,它是:

scriptname >nul 2>nul

8
注意,'&>'是bash特有的(也许是C壳);Korn和Bourne外壳程序需要2> / dev / null或2>&1(将stderr发送到与stdout相同的位置)。Korn Shell程序似乎将'&>'解释为“在后台运行直到&的内容,然后对空命令执行I / O重定向”。
乔纳森·勒夫勒

2
请注意,某些命令直接写入终端设备,而不是标准输出/错误。要进行测试,请放入echo foo > $(tty)脚本并运行./test.sh &> /dev/null-输出仍会打印到终端。当然,如果您正在编写不使用此类命令的脚本,这不是问题。
l0b0

1
@ l0b0,有没有办法使脚本(或任何其他程序)的tty有所不同,以便无论您的示例如何都重定向所有输出?我知道屏幕和脚本可以做类似的事情,但是两者都是挑剔的,并且从* nix到* nix不等。
布伦特2014年

/dev/nullCygwin中存在@yang ,您无需使用nul
dimo414 '16

47

就像是

script > /dev/null 2>&1

这将阻止标准输出错误输出,并将它们都重定向到/dev/null


5
如果您要保存一些输入,也可以通过&>实现;)
andynormancx

1
即使将其添加到我的gs(GhostScript)命令中,它仍然会打印出****警告:文件的%% EOF标记已损坏,或%% EOF之后出现了垃圾。有什么建议吗?
ZurabWeb 2014年

这不能在Unix系统上运行,我必须做 2>/dev/null
alper

13

尝试

: $(yourcommand)

: 是“什么都不做”的缩写。

$() 只是您的命令。


3
非常有趣,但有一个局限性:返回的状态码始终为0(成功)。让我们看一个使用命令的示例,该命令false始终返回1(失败)。例如( echo foo | tee file ; false ) && echo bar显示foo。使用技巧来抑制输出:( : $(echo foo | tee file ; false) ) && echo bar。但是它显示的bar含义是返回状态代码0(这不是的返回状态代码false)。请提供此限制以更新您的答案。干杯
olibre 2015年

2
@olibre,那又如何DUMMY=$(yourcommand)呢?它没有您提到的限制。:)
semente

3
@semente完美:该命令DUMMY=$( echo foo | tee file ; false ) && echo bar不显示任何内容。然后DUMMY=$( echo foo | tee file ; true ) && echo bar显示命令bar。让我知道您是否提供支持的答案;-)干杯
寡头

9

在某些情况下可能适用的替代方法是将命令的结果分配给变量:

$ DUMMY=$( grep root /etc/passwd 2>&1 )
$ echo $?
0
$ DUMMY=$( grep r00t /etc/passwd 2>&1 )
$ echo $?
1

由于Bash和其他POSIX命令行解释器不将变量分配视为命令,因此应遵守当前命令的返回码。

注意:使用typesetor declare关键字进行分配被视为命令,因此,如果返回值是分配本身而不是在子外壳程序中执行的命令,则返回的评估代码是:

$ declare DUMMY=$( grep r00t /etc/passwd 2>&1 )
$ echo $?
0

6

就像andynormancx的post一样,使用以下命令(如果您在Unix环境中工作):

scriptname > /dev/null

或者,您可以使用它(如果您在Windows环境中工作):

scriptname > nul

1
实际上,您可以比Windows Shell做得更好。如果改为使用“脚本名> nul”,则您甚至都没有要删除的文件,因为Windows中的“ nul”等效于/ dev / null。
andynormancx

1
@andynormancx:那就是我讨厌Windows文件系统布局的原因。无论您位于哪个目录(即使您位于可以具有这些文件名的文件系统中,例如在网络共享中),它都“保留” NUL,COM1,LPT1,CON等文件名。
dreamlax

我不认为自DOS 5.x以来我就没有真正使用过NUL,当我看到这个答案时突然想起了记忆;)
andynormancx 2009年

如果您> nul在Windows上使用cygwin或git bash来使用,但是现在您陷在nul无法删除的文件中,请尝试尝试一下此答案,它的工作原理很吸引人。
守护进程画家

4

看一下Linux文档项目中的这个例子:

3.6示例:stderr和stdout 2文件

这会将程序的每个输出放置到文件中。如果您要以绝对静默方式传递命令,有时这适合cron条目。

     rm -f $(find / -name core) &> /dev/null 

也就是说,您可以使用以下简单的重定向:

/path/to/command &>/dev/null

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.