【问题标题】:Redirection vs Piping [duplicate]重定向与管道[重复]
【发布时间】:2020-01-04 04:41:27
【问题描述】:

声明cat a.txt | wc和声明wc < cat a.txt有什么区别。在这两种情况下,cat a.txt 的输出不是被定向到wc 吗?

【问题讨论】:

    标签: bash command-line terminal


    【解决方案1】:

    绝对不是。在第二种情况下 (wc < cat a.txt),您正在调用命令 wc a.txt,同时将名为 cat 的文件连接到进程的标准输入。

    这可能看起来令人困惑,但大多数 shell 允许您将输入重定向到命令行中的任何位置。

    wc a.txt < cat
    

    将与(可以说更令人困惑)相同

    wc < cat a.txt
    

    要将命令的输出重定向到另一个命令的输入,请使用管道字符。要以文件作为标准输入来调用命令,请使用 V 形。

    现在,现代 shell 将允许您键入如下命令:

    wc <(cat a.txt)
    

    这称为进程替换,与您询问的两种方法中的任何一种都不完全相同。在这种情况下,shell 将调用进程cat a.txt 并将其输出“捕获”到文件描述符中。然后,shell 将调用“main”命令 (wc) 并将对该文件描述符的引用作为参数传递,就好像它是一个文件名一样。它使需要简单文件名的命令能够读取 ad hoc 命令的输出。

    【讨论】:

    • wc &lt; a.txt 怎么样?和cat a.txt | wc一样吗?
    • 功能上确实如此。它将达到相同的结果,但 cat 仅在您需要 concatenate 文件时才真正有用(例如 cat a.txt b.txt c.txt d.txt | wc)。 cat one_file | command 无缘无故地生成猫,而您可以简单地完成 command &lt; one_file
    • 副本有 Jonathan Leffler 的一个很好的答案,它显示了一个无用的 cat 增加了多少额外开销。
    • @tripleee,啊...
    • 确实,我赞成你的回答;但我认为这个特殊问题不会为未来的访问者增加价值。
    猜你喜欢
    • 2017-12-31
    • 2012-03-22
    • 2012-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-11
    相关资源
    最近更新 更多