返回

重定向 stderr 至 /dev/null,同时保留 stdout:屏蔽错误消息,保留有用输出

Linux

重定向 stderr 至 /dev/null,同时保留 stdout

前言

在 Linux 系统中,错误消息和标准输出通常会同时显示在终端中。当执行某些命令时,错误消息可能会淹没有价值的输出信息,影响我们的分析。本文将介绍如何仅将 stderr(标准错误输出)重定向到 /dev/null,同时保留 stdout(标准输出)。

问题

假设我们要在当前目录及其子目录中搜索包含特定字符串的文本文件。可以使用以下命令:

find . -type f -name "*.txt" | xargs grep -li 'needle'

然而,当搜索的文件不可访问时,grep 命令会输出以下错误消息:

grep: can't open "foo.txt"

为了消除这些错误消息,我们尝试将 stderr 重定向到 /dev/null,但以下命令不起作用:

find . -type f -name "*.txt" | xargs grep -li 'needle' 2>/dev/null

解决方案

要正确重定向 stderr,同时保留 stdout,我们需要使用以下命令:

find . -type f -name "*.txt" | xargs grep -li 'needle' &> /dev/null

说明

  • &> 运算符将 stdout 和 stderr 都重定向到 /dev/null
  • /dev/null 是一个特殊设备文件,它会丢弃所有写入它的数据。
  • 通过这种方式,grep 命令的错误消息将被丢弃,而找到的文件仍会打印到终端中。

示例

以下示例演示了如何使用此命令:

$ find . -type f -name "*.txt" | xargs grep -li 'needle' &> /dev/null

# grep 输出
/path/to/file1.txt
/path/to/file2.txt
/path/to/file3.txt

# grep 错误消息被抑制

注意事项

请注意,此解决方案会丢弃所有 stderr 输出,包括来自其他命令的错误消息。如果需要保留其他命令的错误消息,可以使用更复杂的重定向技术。

结论

通过使用 &> 运算符,我们可以轻松地将 stderr 重定向到 /dev/null,同时保留 stdout。这对于抑制不必要的错误消息,同时保持对有用输出的访问非常有用。

常见问题解答

  1. 为什么 2>/dev/null 不起作用?

    • 2>/dev/null 只会重定向 stderr,而 &> 将 stdout 和 stderr 都重定向。
  2. 这个技术可以用来隐藏所有错误消息吗?

    • 是的,只要将 &>/dev/null 应用于任何命令即可。
  3. 这会影响其他命令的错误消息吗?

    • 是的,它会丢弃来自管道中所有命令的 stderr 输出。
  4. 是否有其他重定向 stderr 的方法?

    • 除了 &> 之外,还可以使用 |& tee /dev/null> /dev/null 2>&1
  5. 这个技术在哪些场景下有用?

    • 当你需要抑制不需要的错误消息,而又不影响其他命令的输出时,此技术很有用。