为什么使用管道而不是输入重定向
我是linux系统的新手,我无法理解为什么我们需要两个可以重定向输出的运算符:pipe as |
和输出重定向运算符>
? 难道我们不能只使用第二个吗? 大多数时候,我看到如果将多个命令链接在一起,则使用管道。 但是,如果输出被重定向到文件,如echo 'hello' > filename
,则使用输出重定向运算符。 我在这里想念的是什么?
要记住的关键点是管道是进程间通信设备,它允许两个进程(这就是命令实际上是什么)来交换数据,而重定向操作符则用于操纵特定进程写入的位置。
在videoUnix Pipeline中 , awk
语言的创建者和在AT&T Unix上工作的原始人之一Brian Kernighan解释说:
首先,您不必编写一个大型程序 – 您已经拥有可能已经完成部分工作的现有小型程序……另一个原因是,您正在处理的数据量可能不适合你把它存储在一个文件中…因为记住,我们回到了这些东西上的磁盘,如果幸运的话,还有一兆字节或两个数据…所以管道从来没有必要实例化整个输出
如您所见,在创建管道的上下文中,它们实际上不仅仅是通信设备,还节省了存储空间并简化了开发。 当然,我们可以对所有内容使用输出/输入重定向(特别是现在存储容量在太字节范围内),但从存储的角度来看效率低,而且处理速度也很快 – 记住你是直接输出输出从一个命令到另一个命令 。 考虑像command1 | grep 'something'
command1 | grep 'something'
。 如果首先将command1
输出写入文件,则需要时间来编写所有内容,然后让grep
遍历整个文件。 使用管道和输出缓冲的事实(意味着左侧进程在右侧进程准备再次读取之前暂停),输出直接从一个命令转到另一个命令,从而节省时间。
值得注意的是,对于进程间通信,有一个命名管道的用例,你可以使用>
运算符从一个命令写入,而<
从另一个命令读取它,这是你的一个用例我希望在多个脚本/命令可以写入并同意该特定目标的文件系统上具有特定目标。 但是当它不必要时,匿名管道 是你真正需要的。
我相信<>运算符用于读/写文件,而| symbol用于将一个命令的stdout传递给另一个命令。
cal | less
允许您在名为less的命令中查看cal的输出。
cal > less
将cal的输出放入一个名为less的文件中。
-
|
用于将一个命令的输出作为输入发送到管道符号后面的另一个命令。$ echo foo | grep -o 'f' f
-
要将一个命令的输出重定向到文件,可以使用输出重定向
>
运算符。$ echo foo > file1
它将
foo
写入file1。 您无需手动创建该文件。 -
如果要将输出重定向到许多文件,则必须使用
tee
命令。echo foo | tee file1 file2
它将
foo
写入file1和file2。 您无需手动创建该文件。 现在file1和file2只包含字符串foo
。
有很多关于输出重定向的讨论,但我认为这个问题是关于输入的。 我将忽略>
和>>
因为它们与输入无关。 相反,我将专注于<
, <(...)
和|
:
-
<
期望从文件读入STDIN
同时, -
<(...)
为命令的STDOUT
提供文件句柄(...
这里) -
|
将STDOUT
从一个进程导入下一个进程的STDIN
所以<
不直接等同于一个管道(它从文件中读取)而<(...)
是从正确的位置读取,但是它给出了一个文件句柄作为输出。 您需要将它们组合起来以提供与管道相当的效果。
a | b < <(a) b
只是阅读它,我希望完整解释为什么管道存在。 它更具可读性。