Shell 重定向输入和输出

2021-09-21 17:28:04
admin
1417
最后编辑:admin 于 2021-09-26 10:22:05

输出重定向

平时我们敲命令时,其标准输出是显示在终端窗口中。除此之外,Shell 可以将命令的输出重定向到另一个位置(比如文件)。

最基本的重定向是将命令的输出发送到一个文件中。使用重定向操作符 > 实现。

command > outputfile

实例:

将根目录下的目录详情重定向保存到 test.txt 文件中。

$ ll -a > /data/test.txt

打开 test.txt,可以看到里面的内容:

002.png

注意:如果输出文件已经存在了,重定向操作符会用新的文件数据覆盖已有文件。

如果不想覆盖文件原有内容,而是想将命令的输出追加到已有文件中,可以用双大于号 >> 来追加数据。

command >> outputfile

输入重定向

将文件的内容重定向到命令。(与输出重定向相反),用小于号 < 实现。

command < inputfile

实例:

我们将上面那个例子反过来看,通过将 test.txt 的内容重定向给 wc 命令,从而得到文件中内容的行数。

$ wc -l < /data/test.txt 
27

记忆方法:在命令行上,命令总是在左侧,而重定向符号“指向”数据流动的方向。

内联输入重定向

除了使用文件进行输入重定向,Shell 还支持在命令行中直接指定用于输入重定向的数据。使用 << ,以及首尾一致的文本标记来实现。

command << marker
data
marker

实例:

$ wc -l << EOF
heredoc> hello world1 
heredoc> hello world2
heredoc> hello world3
heredoc> EOF
3

管道

有时我们需要将一个命令的输出作为另一个命令的输入。但如果先通过命令输出重定向到文件,再从文件重定向到命令,这种方式可用但太繁琐。我们可以将命令输出直接重定向到另一个命令,这个过程叫作管道连接

管道符号为竖线:   放在两个命令之间,将一个命令的输出重定向到另一个命令。

command1 | command2

linux会同时运行这两个命令,在系统内部将他们连接起来。在第一个命令产生输出的同时,输出会被立即送给第二个命令。

实例:

依旧借助前面的例子,我们将 ll -a 命令的输出直接通过管道传输给 wc -l ,得到行数。

$ ll -a | wc -l 
27

可以在一条命令中使用多条管道,可以持续地将命令的输出通过管道传给其他命令进行细化操作。

command1 | command2 | command3

记忆方法:竖线可以想象成是连接两个命令的管道,数据流总是从左往右“流动”。从命令1流向命令2,再从命令2流向命令3……