为什么不将文件名列表导入cat?

时间:2014-10-18 19:56:26

标签: unix pipe

cat没有从管道输入中获取文件名列表的设计原理是什么?为什么设计师选择以下方法不起作用?

ls *.txt | cat

而不是这样,他们选择我们需要将文件名作为参数传递给cat

ls *.txt | xargs cat

2 个答案:

答案 0 :(得分:8)

当您说ls *.txt | cat无法正常工作时,您应该说它并不像您期望的那样有效。事实上,它的工作方式与它的工作方式相同。

来自man

cat - Concatenate FILE(s), or standard input, to standard output

假设下一个输出:

$ ls *.txt
file1.txt
file2.txt

... cat的输入将是:

file1.txt
file2.txt

......而这正是标准输出

cat输出的内容

在某些贝壳中,它相当于:

cat <(ls *.txt)

ls *.txt > tmpfile; cat tmpfile

所以,cat真正起作用,因为他们的设计师希望这样做。


另一方面,您期望的是cat将其输入解释为一组文件名以读取和连接其内容,但当您管道到{{1}时},该输入作为一个孤独的文件。

答案 1 :(得分:3)

为简而言之,cat是一个命令,如echocp,以及其他一些命令,它们无法将管道重定向的输入流转换为参数。

因此,使用xargs将输入流作为参数传递给命令。

此处有更多详情:http://en.wikipedia.org/wiki/Xargs

作为一名前unix SA,现在是Python开发人员,我相信我可以将Python中的xargs与StringIO / CStringIO进行比较,因为它有同样的帮助。

当谈到你的问题时:为什么他们不允许输入流?这就是我的想法

除了他们,没有人可以回答这个问题。

但是,我认为,cat不是要打印到stdout文件的内容,而命令echo是打印到stdout字符串的内容。

这些命令中的每一个在创建时都有特定的角色。