我想知道为什么ls hello.txt|cat
与cat
hello.txt
没有做同样的事情?我试图将ls
的结果传递给cat
,这似乎是有意义的,因为'ls hello.txt'的结果是hello.txt本身。
答案 0 :(得分:3)
如果输入管道为cat
,则结果为输入。这就是cat
处理stdin的方式。一般来说,程序应该以不同于处理参数的方式处理stdin。
也许这些可以帮助你更清楚地看到它:
echo "hello" | cat
=> hello
echo "hello"
将“hello”提供给cat
,而cat
使用stdin的行为只是打印出它在stdin中收到的任何内容。所以打印出“你好”。
cat hello.txt | cat
=> prints out the text of hello.txt
第一个cat
输出file.txt
的内容,第二个cat
输出它在stdin中收到的任何内容 - 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
的内容 ...但它没有,它只是输出名称。并且cat
接受该名称,并立即打印出该名称。 ls hello.txt
的结果实际上只是字符串“hello.txt”...它不是文件的内容。并且cat
只输出它接收的内容 - 字符串“hello.txt”。 (不是文件的内容)
答案 1 :(得分:2)
David C. Rankin和Ben Voigt都是正确的。
cat hello.txt
写入文件的输出" hello.txt"到stdout(例如到你的命令提示符。
ls hello.txt
写入值" hello.txt"到stdout。 cat
,没有参数,从它的stdin读取(而不是解析命令行参数)。因此,ls hello.txt | cat
执行以下操作:
一个。 shell执行" ls hello.txt"并生成输出" hello.txt"。
湾然后shell创建一个管道到第二个命令," cat",并指示" hello.txt"对猫的标准。
℃。 "猫"读取stdin并输出file" hello.txt"的值它的stdout。
答案 2 :(得分:0)
命令ls hello.txt|cat
有点模棱两可,因为你通过把管道(|)传递给ls命令的结果可以通过
ls hello.txt|xargs cat
我能弄清楚的是ls将输出作为cat的标准输入,而cat则将filename作为参数。
另一种实现方式是
cat $(ls hello.txt)