抑制 bash 脚本中的 stderr 消息

抑制 bash 脚本中的 stderr 消息

考虑以下(有点愚蠢)脚本名称“test1.sh”:

#/bin/bash
#
sleep 10 &
echo sleep pid = $!
pkill sleep

当我运行它时,我不仅得到了 echo 的输出,还得到了 bash 在 stderr 上睡眠死亡的报告:

$ ./test1.sh
sleep pid = 3551
./test1.sh: line 5:  3551 Terminated              sleep 10

在这种情况下,我想禁止打印输出到 stderr。我知道我可以在命令行上执行此操作,如下所示:

$ ./test1.sh 2> /dev/null

...但是有没有办法抑制它之内剧本? (我知道我可以将它包装在第二个脚本中并让包装器重定向它,但一定有更简单的东西......)

答案1

你说得对; pkill 不会生成消息,而 bash 会生成消息。你建议

$ ./test1.sh 2> /dev/null

是一个可能的解决方案。正如 UVV 指出的,脚本中的等效操作是

exec 2> /dev/null

这会将脚本的 stderr 重定向/dev/null 到此语句,直到将其更改回来。将其改回的笨拙方法包括

exec 2> /dev/tty

它将 stderr 重定向到终端。这可能(但不一定)是它原来的位置。

或者

exec 2>&1

这将 stderr 设置为与 stdout 相同,并且可能是错误的。

比较靠谱的方法是

执行3>&2
执行 2> /dev/null
(做一些你不想看到 stderr 的事情。)
执行2>&3

它将原始的 stderr 保存在文件描述符 3 中,然后恢复它。

其他抑制进程死亡公告的方法包括

(sleep 10 & pkill sleep) 2> /dev/null

{ sleep 10 & pkill sleep;} 2> /dev/null

仅更改分组命令的 stderr。

答案2

根据你可以这样做:

#!/bin/bash
exec 2>/dev/null
ls -al test

相关内容