Linux Bash输出重定向和命令管道
在本教程中,我们将学习如何在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脚本时。