为什么`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.txt
的 contents...但它并没有',它只是输出名称。 cat
接收该名称,然后立即打印该名称。 ls hello.txt
的 result 实际上只是字符串 "hello.txt"...它不是文件的内容。 cat
只是输出它接收到的内容——字符串 "hello.txt"。 (不是文件的内容)
David C. Rankin 和 Ben Voigt 都是正确的。
cat hello.txt
将文件 "hello.txt" 的输出写入标准输出(例如,写入您的命令提示符。
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" 的值输出到它的标准输出。
我想知道为什么 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.txt
的 contents...但它并没有',它只是输出名称。 cat
接收该名称,然后立即打印该名称。 ls hello.txt
的 result 实际上只是字符串 "hello.txt"...它不是文件的内容。 cat
只是输出它接收到的内容——字符串 "hello.txt"。 (不是文件的内容)
David C. Rankin 和 Ben Voigt 都是正确的。
cat hello.txt
将文件 "hello.txt" 的输出写入标准输出(例如,写入您的命令提示符。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" 的值输出到它的标准输出。