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