cat
没有从管道输入中获取文件名列表的设计原理是什么?为什么设计师选择以下方法不起作用?
ls *.txt | cat
而不是这样,他们选择我们需要将文件名作为参数传递给cat
:
ls *.txt | xargs cat
答案 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
是一个命令,如echo
或cp
,以及其他一些命令,它们无法将管道重定向的输入流转换为参数。
因此,使用xargs将输入流作为参数传递给命令。
此处有更多详情:http://en.wikipedia.org/wiki/Xargs
作为一名前unix SA,现在是Python开发人员,我相信我可以将Python中的xargs与StringIO / CStringIO进行比较,因为它有同样的帮助。
当谈到你的问题时:为什么他们不允许输入流?这就是我的想法
除了他们,没有人可以回答这个问题。
但是,我认为,cat不是要打印到stdout文件的内容,而命令echo是打印到stdout字符串的内容。
这些命令中的每一个在创建时都有特定的角色。