【发布时间】:2014-10-18 19:56:26
【问题描述】:
cat 不从管道输入中获取文件名列表的设计原理是什么?为什么设计师选择以下不起作用?
ls *.txt | cat
他们选择我们需要将文件名作为参数传递给cat,而不是这样:
ls *.txt | xargs cat
【问题讨论】:
cat 不从管道输入中获取文件名列表的设计原理是什么?为什么设计师选择以下不起作用?
ls *.txt | cat
他们选择我们需要将文件名作为参数传递给cat,而不是这样:
ls *.txt | xargs cat
【问题讨论】:
简而言之,cat 是一个命令,如 echo 或 cp 以及其他一些命令,它不能将管道重定向的输入流转换为参数。
因此,使用 xargs 将输入流作为参数传递给命令。
更多详情:http://en.wikipedia.org/wiki/Xargs
作为前 unix SA 和现在的 Python 开发人员,我相信我可以将 xargs 与 Python 中的 StringIO/CStringIO 进行比较,因为它的帮助方式相同。
当谈到您的问题时:他们为什么不允许流输入?这是我的想法
除了他们之外没有人能回答这个问题。
然而,我相信 cat 是为了将文件的内容打印到标准输出,而命令 echo 是为了将字符串的内容打印到标准输出。
这些命令中的每一个在创建时都有特定的角色。
【讨论】:
cat是一个非常常见的命令。所以cat 中的每一个设计决策很可能都是经过深思熟虑的。
cat不接受管道重定向?事实上,它可以很好地用作过滤器。
当您说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 在标准输出中输出的内容
在某些 shell 中,它相当于:
cat <(ls *.txt)
或
ls *.txt > tmpfile; cat tmpfile
所以,cat 确实按照他们的设计师所期望的那样工作。
另一方面,您所期望的是cat 将其输入解释为一组文件名以读取和连接其内容,但是当您管道 到cat 时,该输入作为一个单独的文件工作。
【讨论】:
ls *.txt > tmpfile; cat tmpfile
cat *.txt?
ls *.txt | cat 与cat <(ls *.txt) 的工作方式相同,因为它是从标准输入读取的。