阻止Bash命令的输出
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设备结合起来,我们可以使错误输出、正常输出或两者都停下来。