Linux Bash输出重定向和命令管道

时间:2020-07-27 12:58:53  来源:igfitidea点击:

在本教程中,我们将学习如何在Linux Bash环境中使用输出重定向和管道。

在Linux Bash中,有两种类型的输出,STDOUT(标准输出)和STDERR(标准错误)。

  • 标准输出也称为STDOUT是Linux命令或者程序的输出。例如,LS命令的STDOUT是列表文件和目录。
  • 标准错误 - 命令也给出错误。例如,如果我们在不存在的文件上运行ls命令,则会给出错误消息“没有这样的文件或者目录”。

另请注意,一个命令可以同时输出STDOUT和STDERR。
例如,我们正在尝试使用CAT命令连接两个文件“TXT1'AND'TXT2”,但系统上不存在文件'TXT2'。

cat txt1 txt2
This is TXT 1
cat: txt2: No such file or directory

根据前述示例,CAT命令首先读取“TXT1”并输出其内容“这是TXT 1”。
然后它将尝试读取TXT2并在TXT2不存在的情况下发送错误“没有这样的文件或者目录”。

默认情况下,STDOUT和STDERR都会发送到Linux终端。

Bash输出重定向运算符

下表显示了Linux输出重定向中使用的运算符。

运算符重定向类型
>将stdout重定向到文件。
>>将stdout重定向到文件,附加到当前文件而不是覆盖。
2>将stderr重定向到文件。
2>>将stderr重定向到文件,附加到当前文件而不是覆盖。
&>将stdout和stderr发送到一个文件。
2>&1将stderr重定向到与stdout相同的位置。
|将一个命令的输出作为输入发送到另一个命令。
|&将一个命令的输出和错误作为输入发送到另一个命令。

将标准输出重定向到文件

使用Bash输出重定向我们可以将STDOUT和STDERR发送到文件。
STDOUT的重定向由“>”更大的符号控制。

例如,以下命令将将LS命令的输出重定向到名为list.txt的文件:

ls -l > list.txt

echo“Hello World”到文本文件:

echo "Hello World" > hello.txt

正如我们所看到的,要重定向输出,我们使用的是operator(>)。
如果文件不存在,则将创建它,如果存在,则将其内容与命令的输出覆盖。

双倍大于符号(>>)将输出添加到文件而不是覆盖。

ls -l >> list.txt

请注意,我们只是重定向标准输出,任何错误消息仍然进入Linux终端窗口。

向文件发送标准错误

由NO“2”表示的标准错误,因此我们使用2>运算符重定向STDERR。

cat file1 nofile 2> error.txt

根据前面的示例,任何错误消息都将重定向到错误.txt文件。

'2 >>'运算符将STDERR添加到文件中。

cat file1 nofile 2>> error.txt

重定向标准输出和标准错误

我们可以将输出和错误重定向到两个不同的文件或者同一文件中。

以下示例将重定向stdout到stdout.txt文件,错误将发送到stderr.txt文件。

cat file1 nofile > stdout.txt 2> stderr.txt

重定向两个输出到我们使用'&>'运算符的同一文件。

cat file1 nofile &> output.txt

还可以使用以下格式(订单问题):

cat file1 nofile > output.txt 2>&1

这告诉CAT命令将STDOUT发送到OUTPUT.TXT后跟'2>&1'运算符,告诉错误也应将其重定向到与stdout(output.txt)的相同位置。

发送stdout和stderr to/dev/null

/dev/null是Linux中的特殊文件,发送到/dev/null的任何内容将消失。
我们不想看到的任何东西,我们将它发送到/dev/null。

这主要用于Linux shell脚本,我们不需要任何输出。

例子

运行find命令以搜索/etc目录中的passwd文件,并将标准错误发送到/dev/null:

find /etc -name passwd  2> /dev/null

搜索passwd文件,输出发送到输出.txt和标准错误/dev/null:

find /etc -name passwd > output.txt 2> /dev/null

将stdout和stderr发送到/dev/null:

systemctl restart httpd > /dev/null 2>&1

用管道和管道重定向

另一个强大的Bash功能是,从一个命令的输出可以用作另一个命令的输入,这是通过使用管道(|)符号完成的。
这通常与Linux grep命令一起使用以过滤输出。

在以下示例中,我们将LS的输出管道向Grep命令送出:

ls -l /usr/bin/| grep python

如果目录列表太长以适合 Screen,我们可以将其输出管制到较少的命令:

ls -l /usr/bin/| grep python | less

即使它看起来很简单,输出重定向在Bash中是非常有用的功能,尤其是在写shell脚本时。