Contents

bash命令的静默输出

1. 概述

在本快速教程中,我们将重点介绍如何使 Bash 命令的静默输出。

2. 先决条件

在静默输出之前,我们首先需要了解 Bash 在执行命令时如何处理输出。

2.1.标准输出和错误

执行 Bash 命令时,会创建一个新进程。此过程中的任何错误都将写入错误流,而任何其他输出都将写入输出流。 Bash 还自动为每个进程打开多个文件,由数字文件描述符 (FD) 表示。

其中两个 FD 是标准输出 (stdout) 和标准错误 (stderr)。默认情况下,Bash 将错误流定向到 stderr 并将输出流定向到 stdout。对于 stdout 和 stderr,写入这些 FD 的任何字符都会显示在执行命令的控制台中。

此外,Bash为 stdout FD分配标识符1 ,为 stderr FD分配标识符2

2.2. 重定向输出

我们可以通过将命令的输出重定向到另一个 FD 来更改错误和输出流的默认目的地。我们使用重定向运算符 重定向输出:>

例如,我们可以使用echo 命令将Hello world写入文件foo.txt

echo "Hello world" > foo.txt

2.3. 空设备

此外,Linux 系统有一个特定的设备,/dev/null,写入时什么都不做。因此,重定向到/dev/null*的输出不会被写入任何地方*。

3. 静默输出

为了使命令的静默输出,我们将 stdout 或 stderr(或两者)重定向到*/dev/null*。要选择重定向哪个流,我们需要向重定向操作员提供 FD 编号。

3.1. 标准输出

为了使非错误静默输出,我们将 stdout 重定向到*/dev/null*:

command 1> /dev/null

默认情况下,重定向运算符重定向标准输出,因此我们可以省略1

command > /dev/null

3.2. 标准错误

为了使错误输出静音,我们将 stderr 重定向到*/dev/null*:

command 2> /dev/null

3.3. 所有输出

要同时重定向 stdout 和 stderr,我们必须将 stderr 重定向到 stdout,然后将 stdout 重定向到/dev/null。**要将 stderr 重定向到 stdout,我们使用以下符号:

2>&1

我们将其与将 stdout 重定向到*/dev/null*相结合以使所有输出静音:

command > /dev/null 2>&1

因此,stdout 被重定向到*/dev/null并且 stderr 被重定向到 stdout,导致两个流都被写入/dev/null并静默我们命令*的所有输出。

我们可以将其缩短为以下 Bash 表示法:

command &> /dev/null

请注意,此速记不可移植,仅受 Bash 4 或更高版本支持

虽然不常见,但我们也可以分别将 stdout 和 stderr 重定向到*/dev/null*,但我们不建议使用这种方法,除非我们自动生成 Bash 脚本或者无法使用之前的方法:

command > /dev/null 2> /dev/null