抑制shell脚本错误消息

Joh*_*man 40 shell error-suppression suppress-warnings

在我的shell脚本中,我得到了这些行:

rm tempfl.txt
rm tempfl2.txt
Run Code Online (Sandbox Code Playgroud)

如果这些不存在,我会收到错误消息:

rm: tempfl2.txt: No such file or directory
rm: tempfl.txt: No such file or directory
Run Code Online (Sandbox Code Playgroud)

有没有办法只抑制这些消息,即使它们并不总是出现,因为文件可能存在?

kam*_*uel 61

您有两种选择:

抑制rm警告

$ rm tempfl.txt 2> /dev/null
Run Code Online (Sandbox Code Playgroud)

将脚本输出重定向到 /dev/null

$ ./myscript.sh 2> /dev/null
Run Code Online (Sandbox Code Playgroud)

后者的缺点是缺少脚本生成的所有其他警告消息.

  • rm -f应该小心使用. (5认同)

dav*_*wil 18

作为其他答案的状态,您可以command 2> /dev/null用来丢弃来自command

但是,这是怎么回事?

>是用于重定向输出的运算符。2是对标准错误输出流的引用,即2>=重定向错误输出。

/dev/null是“空设备”,仅吞下提供给它的任何输入。您可以将两者结合起来以有效地丢弃命令的输出。

完整参考:

  • > /dev/null丢掉标准输出
  • 1> /dev/null丢掉标准输出
  • 2> /dev/null扔掉stderr
  • &> /dev/null丢弃stdout stderr

  • 谢谢。这是我看到的第一个完整解释“2&>1”不同部分实际含义的地方。 (8认同)

Fer*_*ida 10

我们可以使用2> /dev/null来抑制输出错误并|| true确保成功退出状态:

\n\n
rm foo\n=> rm: cannot remove \xe2\x80\x98foo\xe2\x80\x99: No such file or directory\n\nrm foo 2> /dev/null\necho $?\n=> 1\n\nrm foo 2> /dev/null || true\necho $?\n=> 0\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果您在 shell 脚本、makefile 等中使用该命令,也许您需要这个。

\n


dev*_*per 5

你应该将所有错误消息重定向到/ dev/null之类的

rm tempfl2.txt 2> /dev/null
Run Code Online (Sandbox Code Playgroud)


mpl*_*ork 5

添加到上面的答案中:保留错误消息(例如权限被拒绝等)可能是一个更好的主意。在删除之前测试文件是否存在:

[ -f file.txt ] && rm file.txt
Run Code Online (Sandbox Code Playgroud)

这假设了一个类似 Bourne 的 shell,例如 bash。上面有一个额外的好处,它不会尝试删除目录,有些事情rm不能做。


Pie*_*tto 5

试试这个命令:

rm -f tempfl.txt
Run Code Online (Sandbox Code Playgroud)

-f选项的行为如下:

-f, --force  ignore nonexistent files, never prompt
Run Code Online (Sandbox Code Playgroud)

如果文件不存在,该命令也不会报告非零错误代码.