Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Bash抑制命令的所有输出?_Bash_Shell_Scripting_Echo - Fatal编程技术网

如何使用Bash抑制命令的所有输出?

如何使用Bash抑制命令的所有输出?,bash,shell,scripting,echo,Bash,Shell,Scripting,Echo,我有一个Bash脚本,它运行一个带有参数的程序。该程序输出一些状态(做这个,做那个…)。这个程序没有任何安静的选项。如何防止脚本显示任何内容 我正在寻找类似Windows的东西。以下命令将标准输出发送到空设备(位存储桶) 如果您还希望在那里发送错误消息,请使用其中一种(第一种可能不适用于所有shell): 并且,如果您想记录消息,但看不到它们,请用实际文件替换/dev/null,例如: scriptname &>scriptname.out 为完整起见,在Windows cmd.

我有一个Bash脚本,它运行一个带有参数的程序。该程序输出一些状态(做这个,做那个…)。这个程序没有任何安静的选项。如何防止脚本显示任何内容


我正在寻找类似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