【问题标题】:Why not pipe list of file names into cat?为什么不将文件名列表通过管道传输到 cat 中?
【发布时间】:2014-10-18 19:56:26
【问题描述】:

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

ls *.txt | cat

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

ls *.txt | xargs cat

【问题讨论】:

    标签: unix pipe


    【解决方案1】:

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

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

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

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

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

    除了他们之外没有人能回答这个问题。

    然而,我相信 cat 是为了将文件的内容打印到标准输出,而命令 echo 是为了将字符串的内容打印到标准输出。

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

    【讨论】:

    • 我相信考虑到Unix的设计原则可以回答这个问题,因为cat是一个非常常见的命令。所以cat 中的每一个设计决策很可能都是经过深思熟虑的。
    • 是的,确切地说,请参阅我编辑的答案。 Unix 有很多原则,每个基本的 shell 命令都有其创建的特定角色。
    • 为什么说cat不接受管道重定向?事实上,它可以很好地用作过滤器。
    • 糟糕,确实更正了。我的意思是这是一种不同的用法。并且对 cat 做管道就像将 stdout 重定向到 stdout 并且大多数时候没有真正的兴趣。
    【解决方案2】:

    当您说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 &gt; tmpfile; cat tmpfile
    • 有什么理由不只是简单地cat *.txt
    • 是的,因为我想证明ls *.txt | catcat &lt;(ls *.txt) 的工作方式相同,因为它是从标准输入读取的。
    猜你喜欢
    • 1970-01-01
    • 2015-10-08
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    • 2016-06-11
    • 1970-01-01
    • 2020-02-16
    • 2019-01-24
    相关资源
    最近更新 更多