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

vddsk6oq  于 2023-03-19  发布在  Shell
关注(0)|答案(9)|浏览(225)

我有一个Bash脚本,它运行一个带参数的程序。该程序输出一些状态(做这个,做那个...)。没有任何选项让这个程序保持安静。我如何阻止脚本显示任何东西?
我正在寻找类似Windows的"echo off"

jjjwad0x

jjjwad0x1#

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

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
6qqygrtg

6qqygrtg2#

就像

script > /dev/null 2>&1

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

rn0zuynd

rn0zuynd3#

在某些情况下,另一种可能适用的方法是将命令的结果赋给变量:

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

由于Bash和其他POSIX命令行解释器不将变量赋值视为命令,因此当前命令的返回代码将被考虑。

**注意:**带有typesetdeclare关键字的赋值被认为是一个命令,因此case中计算的返回代码是赋值本身,而不是在子shell中执行的命令:

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

iyfjxgzm4#

试试看

: $(yourcommand)

:是“什么也不做”的缩写。
$()只是您的命令。

ycggw6v2

ycggw6v25#

就像andynormancx的文章一样,使用以下代码(如果你在Unix环境中工作):

scriptname > /dev/null

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

scriptname > nul
d4so4syb

d4so4syb6#

这是另一种选择

scriptname |& :
v1l68za4

v1l68za47#

请看**The Linux Documentation Project**中的示例:

3.6样品:标准错误和标准输出2文件

这将把程序的每个输出放到一个文件中。如果你想让命令在绝对安静的情况下传递,这有时适合于cron条目。

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

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

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

xytpbqjk8#

在脚本中,您可以将以下内容添加到您知道将给予输出的行中:

some_code 2>>/dev/null

不然你也可以试试

some_code >>/dev/null
rur96b6h

rur96b6h9#

>&-关闭文件描述符,甚至不重定向到/dev/null
foo 2>&- >&-
可以关闭标准输入foo 2>&- >&- <&-

相关问题