为什么使用管道而不是输入重定向

我是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 

只是阅读它,我希望完整解释为什么管道存在。 它更具可读性。