【问题标题】:How does find and printf work when using pipes in bash scripting在 bash 脚本中使用管道时 find 和 printf 如何工作
【发布时间】:2011-12-17 22:53:42
【问题描述】:

假设我在 find 命令中使用 printf,如下所示:

     find ./folder -printf "%f\n" | other command which uses the result of printf

在另一个命令部分,我可能有一个排序或类似的东西

在这种情况下 printf 究竟做了什么?它在“|”之后的部分中在哪里打印进程之前的文件名发生了什么?

例如,如果我对文件名进行排序,它将首先对它们进行排序,然后将它们排序在监视器上打印,但在此之前,| 之后的部分究竟如何?获取未排序的文件以便对它们进行排序?在这种情况下,printf 是否将文件名作为 | 之后部分的输入?然后是 | 之后的部分打印在输出中排序的文件名?

对不起我的英语:(

【问题讨论】:

    标签: bash scripting find


    【解决方案1】:

    您的 shell 调用 pipe() 创建两个文件描述符。写入其中一个缓冲区可以在内核中缓冲可供另一个读取的数据。然后它调用fork()find 命令创建一个新进程。在fork() 之后,它关闭stdout(总是fd 1)并使用dup2() 将管道的一端复制到stdout。然后它使用exec() 运行find(用find 替换子进程中的shell 副本)。当find 运行时,它只是像往常一样打印到stdout,但它已经从使它成为管道的shell 继承了它。同时,shell 对 other command...stdin 执行相同的操作,以便创建它时 fd 0 连接到管道的另一端。

    【讨论】:

      【解决方案2】:

      是的,管道就是这样工作的。第一个过程的输出是第二个过程的输入。在实现方面,shell 创建了一个套接字,该套接字从其标准输出接收来自第一个进程的输入,并在其标准输入上将输出写入第二个进程。

      ...如果您有这类问题,或许应该阅读 Unix shell 编程介绍。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-24
        • 1970-01-01
        • 1970-01-01
        • 2018-05-07
        • 1970-01-01
        • 2018-10-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多