【问题标题】:How can I suppress error messages of a command?如何抑制命令的错误消息?
【发布时间】:2015-11-29 12:54:28
【问题描述】:

如何抑制 shell 命令的错误消息?

例如,如果目录中只有jpg 文件,则运行ls *.zip 会给出错误消息:

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

是否有抑制此类错误消息的选项?我想在 Bash 脚本中使用这个命令,但我想隐藏所有错误。

【问题讨论】:

  • 如果您使用ls 获取要处理的文件名列表,don't
  • 您可以使用 shopt -s nullglob 使 glob 变为空。当然,这对 ls 非常有效,因为它会返回目录中的所有文件。如果你使用类似for file in *.zip的东西,它工作
  • 要抑制错误消息,只需将 stderr 重定向到 /dev/null,如 ls *.zip 2>/dev/null
  • @chepner Shellcheck for bash 建议使用 ls 而不是 grep。
  • @KalibZen 在哪里?我说的是避免像 for f in $(ls ...)ls | while read f; do 这样的事情。

标签: linux bash


【解决方案1】:

我尝试 ls -R [existing file] 并立即收到错误。 ls: cannot access 'existing file': 没有这样的文件或目录

所以,我使用了以下内容:

ls -R 2>dev/null | grep -i [现有文件]*

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

或者,在你的情况下:

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

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
【解决方案2】:

要抑制错误消息并返回退出状态,请附加|| 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 的输出,最好将true || 添加到ls 命令之前?
  • @gone 不,true || ls 将首先运行 true,对结果感到满意,甚至不会考虑运行 ls
【解决方案3】:

大多数 Unix 命令,包括ls,会将常规输出写入standard output,将错误消息写入standard error,因此您可以使用Bash redirection 丢弃错误消息,同时保留常规输出:

ls *.zip 2> /dev/null

【讨论】:

  • 感谢您的快速答复。完美!
【解决方案4】:
$ ls *.zip 2>/dev/null

redirectstderr 上的任何错误消息发送到 /dev/null(即您不会看到它们)

请注意返回值(由$? 提供)仍会反映发生了错误。

【讨论】:

    猜你喜欢
    • 2015-01-26
    • 1970-01-01
    • 2019-08-26
    • 2011-02-11
    • 1970-01-01
    • 2013-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多