阻止Bash命令的输出

评论 0 浏览 0 2019-08-23

1.概述

在这个快速教程中,我们将重点讨论如何使Bash命令的输出静默化。

2.前提条件

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

2.1. Standard Output & Error

当执行一个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./dev/null

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

3.阻止输出

为了使一个命令停止输出,我们将stdout或stderr--或两者--重定向到/dev/null。为了选择要重定向的流,我们需要向重定向操作者提供FD号码。

3.1.标准输出

为了让非错误停止输出,我们将stdout重定向到/dev/null

command 1> /dev/null

默认情况下,重定向操作符会重定向stdout,所以我们可以省略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

4.总结

在本教程中,我们学习了Bash进程如何将其错误和非错误输出流向FD,以及如何使用重定向操作符将这些数据流重定向到另一个FD。

通过将重定向与/dev/null设备结合起来,我们可以使错误输出、正常输出或两者都停下来。

最后更新2022-11-18
0 个评论
标签