如何抑制命令的错误信息?

76

如何在 shell 命令中抑制错误信息?

例如,如果一个目录中只有 jpg 文件,运行 ls *.zip 将会产生一个错误信息:

   $ ls *.zip
   ls: cannot access '*.zip': No such file or directory

有没有选项可以抑制这样的错误消息?我想在Bash脚本中使用这个命令,但我想隐藏所有错误。


10
如果你正在使用ls来获取要处理的文件名列表,不要这样做 - chepner
2
你可以使用 shopt -s nullglob 使 glob 变为空。当然,这对于 ls 来说非常有效,因为它会返回目录中的所有文件。但是如果你使用类似 for file in *.zip 的东西,它也能工作。 - user000001
2
为了抑制错误信息,只需将stderr重定向到/dev/null,例如ls *.zip 2>/dev/null - Luis Colorado
@chepner的Shellcheck建议在bash中使用ls而不是grep。 - Kalib Zen
@KalibZen在哪里?我的意思是要避免像这样的东西,比如for f in $(ls ...)或者ls | while read f; do`。 - chepner
我认为 OP 代码没有问题。他可以执行 ab=$(ls input.txt/*findMystring*) 并循环 $ab,但不建议使用以下方式:ls input.txt | grep 'mystring' https://github.com/koalaman/shellcheck/wiki/SC2010 - Kalib Zen
5个回答

113

感谢您的快速回答。非常完美! - Peter
很遗憾,在zsh(macOS上的默认终端)中这将无法工作 - 无论输出被导向到哪里,它都会输出zsh: no matches found: *.zip。不过,在bash中是可以正常运行的。 - undefined

16
$ ls *.zip 2>/dev/null

将标准错误(stderr)的所有错误信息重定向到/dev/null中(也就是说,您不会看到这些错误信息)。

请注意,返回值(由$?给出)仍将反映发生了错误。


11
为了抑制错误消息并使退出状态为0,可以附加|| true。例如:

为了阻止出现错误信息,并且返回退出状态0,请添加|| true。例如:

$ ls *.zip && echo hello
ls: cannot access *.zip: No such file or directory
$ ls *.zip 2>/dev/null && echo hello
$ ls *.zip 2>/dev/null || true && echo hello
hello

$ touch x.zip
$ ls *.zip 2>/dev/null || true && echo hello
x.zip
hello

如果你正在将 ls 的输出进行管道传输,那么在 ls 命令前加上 true || 可能会更好? - gone
9
不,true || ls会先运行true,得出结果后满意并且不会考虑运行ls - Hagen von Eitzen

1

我尝试运行 ls -R [已存在的文件],但立即出现错误。

ls: 无法访问 'existing file': 没有那个文件或目录

因此,我使用了以下命令:

ls -R 2>dev/null | grep -i [已存在的文件]*

ls -R 2>dev/null | grep -i text*

或者,在你的情况下:

ls -R 2>dev/null | grep -i *.zip


1
你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

0

我的解决方案是使用带有Buster的树莓派3。

ls -R 2>/dev/null | grep -i [existing file]*

在Bash脚本中,2>/dev/null非常有用,可以避免无用的警告或错误。

不要忘记斜杠字符。


1
目前你所提供的答案不够清晰明了。请编辑并添加更多细节,以便其他人能够理解它是如何回答问题的。你可以在帮助中心找到有关如何编写好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接