【发布时间】:2019-04-14 10:35:18
【问题描述】:
我无法区分这两行代码,因为每个命令的输出都是相同的
cat volcanoes.txt
cat < volcanoes.txt
【问题讨论】:
-
我想知道这是否可以被解读为pipe, standard input and command-line arguments in bash 的子集。
标签: bash
我无法区分这两行代码,因为每个命令的输出都是相同的
cat volcanoes.txt
cat < volcanoes.txt
【问题讨论】:
标签: bash
< 读取文件(在右侧指定)并将其通过管道传输到左侧命令的 STDIN。
cat 接受输入并将其输出到 STDOUT。
如果您向cat 提供参数,它会从那里获取输入。否则,它将从 STDIN 获取。
将< 与cat 结合使用通常没有用处。
【讨论】:
foo | cat prefix.txt - 发出prefix.txt 后跟foo 的输出——这个用例实际上符合cats 的描述和连接 多个输入的生命使命。如果您对 cat 只有 一个 参数(“一个参数”的措辞暗示是典型的/通常的),那么您通常根本没有充分的理由使用 cat。
cat volcanoes.txt 将 volcanoes.txt 作为参数传递,cat 将尝试在磁盘上定位并打开。
cat < volcanoes.txt 运行不带参数的 cat,interpreter 打开 volcanoes.txt 作为cat 的标准输入。
为了更清楚的例子,尝试使用多个文件进行测试:
echo 1 > a
echo 2 > b
现在您可以通过比较看到差异
grep . a b
对
cat a b | grep .
在第一个中,a 和b 作为参数传递,所以grep 自己打开它们并知道每行数据的来源,因此它会告诉您每行来自哪个文件。
$: grep . a b
a:1
b:2
完成第二种方式,cat 读取两个文件并将内容作为单个匿名流放在grep 的标准输入上,这与您说cat < volcanoes.txt 时对单个文件所做的非常相似。这样,grep 只知道标准输入上有数据,它不能给你额外的信息。
$: cat a b | grep .
1
2
对于cat,它在功能上是相同的,因为cat 是什么和做什么,但它在机制上仍然不同,对于某些程序来说,这种差异可能是严重的,或者至少是相关的。
【讨论】: