考虑以下(有点愚蠢)脚本名称“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