管道和重定向之间的确切区别是什么?
我们应该在哪里使用管道?我们应该在哪里使用重定向?
他们内部如何运作?
答案 0 :(得分:28)
重定向(主要)用于文件(您将流重定向到文件或从文件重定向)。
管道适用于进程:您将流从一个进程管道(重定向)到另一个进程。
基本上你真正做的是通过管道“连接”一个流程的一个标准流(通常是stdout
)到另一个流程的标准流(通常是stdin
)。
管道还有同步“副作用”:它们阻止一个进程(在读取时),当另一个进程无法写入时(或者)当读取进程无法读取足够快时< / strong>(当管道缓冲区已满时)。
答案 1 :(得分:8)
管道将程序的输出定向到另一个程序。
例如:
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?
如果要在程序之间传递输出,则应使用管道;如果要写入文件,请使用重定向。
答案 2 :(得分:3)
基本上,重定向和管道是许多在Unix中实现Inter Process通信的方法。
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的其他方法是:
答案 3 :(得分:1)
重定向:将命令的输出(stdout
和/或stderr
)发送到文件
示例:ls > your_file
将目录列表的结果写入名为your_file
管道:将输出发送到另一个命令。示例ls | wc
将相同的输出(目录列表)发送到计算字符的命令wc
。
答案 4 :(得分:1)
我注意到流水线操作适用于进程替换的输出,但不适用于重定向:
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