Unix 为什么不将文件名列表导入cat?
Unix 为什么不将文件名列表导入cat?,unix,pipe,Unix,Pipe,cat不从管道输入中获取文件名列表的设计原理是什么?为什么设计师们选择了以下不起作用 ls *.txt | cat 相反,他们选择我们需要将文件名作为参数传递给catas: ls *.txt | xargs cat 简而言之,cat是一个命令,类似于echo或cp,以及其他一些命令,它们不能将管道重定向的输入流转换为参数 因此,使用xargs将输入流作为参数传递给命令 详情如下: 作为一名前unix SA和现在的Python开发人员,我相信我可以将xargs与Python中的StringIO
cat
不从管道输入中获取文件名列表的设计原理是什么?为什么设计师们选择了以下不起作用
ls *.txt | cat
相反,他们选择我们需要将文件名作为参数传递给cat
as:
ls *.txt | xargs cat
简而言之,
cat
是一个命令,类似于echo
或cp
,以及其他一些命令,它们不能将管道重定向的输入流转换为参数
因此,使用xargs将输入流作为参数传递给命令
详情如下:
作为一名前unix SA和现在的Python开发人员,我相信我可以将xargs与Python中的StringIO/CStringIO进行比较,因为它在某种程度上也有帮助
当谈到你的问题:为什么他们不允许流输入?以下是我的想法
除了他们,没有人能回答这个问题
但是,我相信,cat是用来打印文件的内容,而echo命令是用来打印字符串的内容
这些命令中的每一个在创建时都有一个特定的角色。当你说
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)
因此,cat
真的像他们的设计师期望的那样工作
另一方面,您期望的是
cat
将其输入解释为一组文件名,以读取和连接其内容,但当您通过管道连接到cat
时,这个输入是一个单独的文件。考虑到Unix的设计原则,我相信可以回答这个问题,因为cat
是一个非常常见的命令。因此,cat
中的每一个设计决策都很可能是故意做出的。是的,没错,请参见我编辑的答案。Unix有很多原则,每个基本shell命令都有其特定的角色。为什么说cat
不接受管道重定向?事实上,它可以很好地作为一个过滤器。哦,没错,纠正了。我的意思是这是一种不同的用法。对猫做一个管道就像把stdout重定向到stdout,大多数时候都没有真正的兴趣。谢谢,这是一个非常简单和清楚的解释。特别是,这一行向我澄清了这个问题:ls*.txt>tmpfile;cat tmpfile
是否有任何理由不只是简单地cat*.txt
?是的,因为我想说明ls*.txt | cat
的工作原理与cat相同
ls *.txt > tmpfile; cat tmpfile