返回

如何仅打印 Bash 中的 stderr,而不打印 stdout?

Linux

如何在 Bash 中仅打印 stderr,不打印 stdout

引言

在 Bash 中,stdout(标准输出)和 stderr(标准错误)是两个独立的流,分别用于显示信息和错误消息。默认情况下,这两个流都会输出到终端。但是,在某些情况下,你可能只想打印 stderr,而不打印 stdout。本文将介绍几种方法来实现这一目标。

使用重定向符号 >&

最简单的方法是使用重定向符号 >&。例如,以下命令将 stderr 重定向到一个名为 error.txt 的文件中,同时丢弃 stdout

php -l "foo/bar.php" 2>&1 > /dev/null

这将仅在 error.txt 文件中打印错误消息,而不会打印 "No errors" 消息。

使用 tee 命令

tee 命令可以将输入同时写入文件和 stdout。例如,以下命令将 stderr 重定向到 error.txt 文件,同时仍将其打印到终端:

php -l "foo/bar.php" 2>&1 | tee error.txt

这将同时在终端和 error.txt 文件中打印错误消息。

使用 grep 命令

如果你只想在终端中打印 stderr,但不想将其写入文件,可以使用 grep 命令。例如,以下命令将仅打印 stderr 中包含 "error" 一词的行:

php -l "foo/bar.php" 2>&1 | grep error

这将仅在终端中打印错误消息,而不会将其写入文件。

使用 sed 命令

最后,你还可以使用 sed 命令来删除 stdout。例如,以下命令将删除 stdout 中的所有行,只留下 stderr

php -l "foo/bar.php" 2>&1 | sed '/No errors/d'

这将仅在终端中打印错误消息,而不会打印 "No errors" 消息。

结论

通过使用这些技术,你可以选择性地打印 stderr,而不打印 stdout。这在需要捕获错误消息或隔离错误消息时非常有用。根据你的具体需求,选择最适合你的方法。

常见问题解答

  1. 如何使用 stderr 重定向错误消息?
    使用重定向符号 2>&1stderr 重定向到一个文件或命令。

  2. 如何同时将 stderr 打印到终端和文件?
    使用 tee 命令将 stderr 同时写入文件和 stdout

  3. 如何过滤 stderr 中的特定消息?
    使用 grep 命令过滤 stderr 中包含特定模式的行。

  4. 如何删除 stdout 中的所有行?
    使用 sed 命令删除 stdout 中的所有行,只留下 stderr

  5. 是否可以使用管道将 stderr 传递给另一个命令?
    是的,可以使用管道将 stderr 传递给另一个命令进行进一步处理。