【发布时间】:2020-01-04 04:41:27
【问题描述】:
声明cat a.txt | wc和声明wc < cat a.txt有什么区别。在这两种情况下,cat a.txt 的输出不是被定向到wc 吗?
【问题讨论】:
标签: bash command-line terminal
声明cat a.txt | wc和声明wc < cat a.txt有什么区别。在这两种情况下,cat a.txt 的输出不是被定向到wc 吗?
【问题讨论】:
标签: bash command-line terminal
绝对不是。在第二种情况下 (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 < a.txt 怎么样?和cat a.txt | wc一样吗?
cat 仅在您需要 concatenate 文件时才真正有用(例如 cat a.txt b.txt c.txt d.txt | wc)。 cat one_file | command 无缘无故地生成猫,而您可以简单地完成 command < one_file。
cat 增加了多少额外开销。