Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 为什么不将文件名列表导入cat?_Unix_Pipe - Fatal编程技术网

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