【发布时间】:2012-03-22 03:45:11
【问题描述】:
管道和重定向之间的确切区别是什么?
我们应该在哪里使用管道,我们应该在哪里使用重定向?
它们在内部是如何工作的?
【问题讨论】:
管道和重定向之间的确切区别是什么?
我们应该在哪里使用管道,我们应该在哪里使用重定向?
它们在内部是如何工作的?
【问题讨论】:
重定向(主要)用于文件(您将流重定向到文件/从文件重定向)。
管道用于进程:您将流从一个进程管道(重定向)到另一个进程。
实际上,您真正要做的是通过管道将一个进程的一个标准流(通常是stdout)“连接”到另一个进程的标准流(通常是stdin)。
管道也有同步“副作用”:当另一个进程没有什么可写(尚未)或读取进程无法读取时,它们会阻塞一个进程(读取时)足够快(当管道的缓冲区已满时)。
【讨论】:
管道将一个程序的输出定向到另一个程序。
例如:
ls * | grep "name"
将当前目录中所有文件的名称通过管道传递给 grep。 重定向将输出定向或附加到文件。
ls * > file # writes all file names in current directory to the "file"
ls * >> file # appends all files names in current directory to the "file"
管道让您不必先写入文件,然后再从文件中读取,从而在另一个程序的输出上执行程序。
ls * > file
grep "name" file
等价于
ls * | grep "name"
至于它们在内部是如何工作的,我现在只是在学习我自己。 但我发现这个链接提供了一些讨论。
How Does Piping Work in Linux?
如果你想在程序之间传递输出,你应该使用管道;如果要写入文件,请使用重定向。
【讨论】:
ls *name* 或者只是printf '%s\n' *name* 或for file in *name*
基本上,重定向和管道是在 Unix 中实现进程间通信的众多方法中的几种。
ls > FileName
ls | grep $myName
它适用于简单的数据共享,例如生产者和消费者。
属性比较:管道始终是单向的,而重定向可用于重定向输入和输出。
ls > grep myFileName [将第一个命令的输出重定向到后面的命令]
sort < fileName.txt [重定向 fileName.txt 文件作为命令排序的输入]
也可以在下面写在单个语句中使用双向重定向。
sort < fileName.txt > sortNewFile.txt
虽然Piping,它始终是提供给后一个命令的第一个命令的输出,并且是同时提供的。
ls | grep myName | awk '{ print $NF }' [单个语句中的多个管道]
注 1: command > fileName 。如果有一个名为fileName 的命令,这将使使用重定向变得更加困难并且更容易出错。必须首先检查是否有一个名为目标文件的命令。
在Unix系统中实现IPC的其他方式有:
【讨论】:
重定向:将命令的输出(stdout 和/或stderr)发送到文件
示例:ls > your_file将目录列表结果写入名为your_file的文件
管道:将输出发送到另一个命令。示例ls | wc将相同的输出(目录列表)发送到命令wc,它计算字符数。
【讨论】:
我注意到流水线适用于进程替换的输出,但不适用于重定向:
bash-3.2$ echo $'one\ntwo\nthree' | tee >(grep o) | cat > pipe
bash-3.2$ echo $'one\ntwo\nthree' | tee >(grep o) > redirect
bash-3.2$ one
two
bash-3.2$ cat pipe
one
two
three
one
two
bash-3.2$ cat redirect
one
two
three
【讨论】: