【问题标题】:Piping and Redirection管道和重定向
【发布时间】:2012-03-22 03:45:11
【问题描述】:

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

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

它们在内部是如何工作的?

【问题讨论】:

    标签: bash shell redirect pipe


    【解决方案1】:

    重定向(主要)用于文件(您将流重定向到文件/从文件重定向)。

    管道用于进程:您将流从一个进程管道(重定向)到另一个进程。

    实际上,您真正要做的是通过管道将一个进程的一个标准流(通常是stdout)“连接”到另一个进程的标准流(通常是stdin)。

    管道也有同步“副作用”:当另一个进程没有什么可写(尚未)或读取进程无法读取时,它们会阻塞一个进程(读取时)足够快(当管道的缓冲区已满时)。

    【讨论】:

    【解决方案2】:

    管道将一个程序的输出定向到另一个程序。

    例如:

    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*
    【解决方案3】:

    基本上,重定向和管道是在 Unix 中实现进程间通信的众多方法中的几种。

    1. 重定向:数据被写入和读取典型的 UNIX 文件。任意数量的进程都可以互操作。共享大型数据集时必须使用此选项。

    ls > FileName

    1. 管道:管道是一个过程,其中一个过程的输出成为另一个过程的输入。它们是在最原始的 Unix 操作系统中演化而来的。它们在同一系统内的进程之间提供单向通信流。管道是通过调用管道系统调用来创建的,该系统调用会创建一对文件描述符。 [对于文件描述符读取http://www.bottomupcs.com/file_descriptors.html]

    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. 套接字

    【讨论】:

    • 谢谢!解释得很好。
    【解决方案4】:

    重定向:将命令的输出(stdout 和/或stderr)发送到文件 示例:ls > your_file将目录列表结果写入名为your_file的文件

    管道:将输出发送到另一个命令。示例ls | wc将相同的输出(目录列表)发送到命令wc,它计算字符数。

    【讨论】:

      【解决方案5】:

      我注意到流水线适用于进程替换的输出,但不适用于重定向:

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-25
        • 2023-03-04
        • 1970-01-01
        • 2020-01-04
        • 2017-12-31
        • 1970-01-01
        相关资源
        最近更新 更多