为什么`ls hello.txt | cat` 不同于 `cat hello.txt`?

Why is `ls hello.txt | cat` different from `cat hello.txt`?

我想知道为什么 ls hello.txt|cat 做的事情和 cat hello.txt 不一样?我试图将 ls 的结果传递给 cat,这似乎是有道理的,因为 'ls hello.txt' 的结果本身就是 hello.txt。

命令 ls hello.txt|cat 有点含糊不清,因为你通过管道 (|) 传递 ls 命令的结果,你想做的可以通过

实现
ls hello.txt|xargs cat

我能弄清楚的是,ls 将输出作为标准输入提供给 cat,而 cat 需要文件名作为参数。

另一种实现方式是

cat $(ls hello.txt)

如果将输入通过管道传递给 cat,结果就是输入。这就是 cat 处理标准输入的方式。通常,程序应该以不同于对待参数的方式对待标准输入。

也许这些可以帮助你看得更清楚一点:

echo "hello" | cat
=> hello

echo "hello" 将 "hello" 馈送到 cat,而 cat 对标准输入的行为只是打印出它在标准输入中接收到的任何内容。所以它打印出 "hello".

cat hello.txt | cat
=> prints out the text of hello.txt

第一个 cat 输出 file.txt 的内容,第二个 cat 输出它在标准输入中接收到的任何内容 -- file.txt 的内容。

那么,ls hello.txt输出什么?

ls hello.txt 不输出 hello.txt 中的文本。相反,如果文件存在,它只会输出字符串 "hello.txt"

ls hello.txt
=> hello.txt

ls hello.txt | cat
=> hello.txt

就像这样:

echo "hello"
=> hello

echo "hello" | cat
=> hello

我想也许最大的误解之一是您认为 ls hello.txt 输出 hello.txtcontents...但它并没有',它只是输出名称。 cat 接收该名称,然后立即打印该名称。 ls hello.txtresult 实际上只是字符串 "hello.txt"...它不是文件的内容。 cat 只是输出它接收到的内容——字符串 "hello.txt"。 (不是文件的内容)

  1. David C. Rankin 和 Ben Voigt 都是正确的。

  2. cat hello.txt 将文件 "hello.txt" 的输出写入标准输出(例如,写入您的命令提示符。

  3. ls hello.txt 将值 "hello.txt" 写入标准输出。 cat,没有参数,从它的标准输入读取(而不是解析命令行参数)。因此,ls hello.txt | cat 执行以下操作:

    一个。 shell 执行 "ls hello.txt" 并生成输出 "hello.txt".

    b。 shell 然后创建一个管道到第二个命令 "cat",并将 "hello.txt" 指向猫的标准输入。

    c。 "cat" 读取标准输入并将文件 "hello.txt" 的值输出到它的标准输出。