管道和重定向

时间:2012-03-04 08:59:49

标签: bash shell redirect piping

管道和重定向之间的确切区别是什么?

我们应该在哪里使用管道?我们应该在哪里使用重定向?

他们内部如何运作?

5 个答案:

答案 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通信的方法。

  1. 重定向:向典型的UNIX文件写入和读取数据。任何数量的进程都可以互操作。这在共享大型数据集时必须使用。
  2. ls > FileName

    1. 管道:管道是将一个进程的输出作为另一个进程的输入的进程。它们是在Unix操作系统的最原始形式中发展而来的。它们在同一系统内的进程之间提供单向通信流。通过调用管道系统调用创建管道,该管道系统调用创建一对文件描述符。 [对于文件描述符,请阅读http://www.bottomupcs.com/file_descriptors.html]
    2. 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的其他方法是:

      1. 命名管道
      2. <强>信号
      3. 共享内存
      4. 插槽

答案 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