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

时间:2016-02-20 05:54:48

标签: linux pipe cat ls

我想知道为什么ls hello.txt|catcat hello.txt没有做同样的事情?我试图将ls的结果传递给cat,这似乎是有意义的,因为'ls hello.txt'的结果是hello.txt本身。

3 个答案:

答案 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)

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

  2. cat hello.txt写入文件的输出" hello.txt"到stdout(例如到你的命令提示符。

  3. 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)