【问题标题】:Unix pipe into lsUnix管道到ls
【发布时间】:2013-08-15 04:18:03
【问题描述】:

到目前为止,我以为我了解 *nix 管道...我有一个名为 studio 的可执行文件,它符号链接到我安装的 Android Studio,我以为我可以使用

获得链接到的位置
which studio | ls -l

但这不起作用。它给我的效果相当于在当前目录中运行ls -l

如果我运行which studio,我会得到/home/me/bin/studio。如果我运行ls -l /home/me/bin/studio,我会得到预期的输出,显示符号链接的位置。

那么为什么管道版本不起作用?我对管道有什么不了解的地方?

【问题讨论】:

    标签: linux unix pipe ls


    【解决方案1】:

    为此,您需要xargs

    which studio | xargs ls -l
    

    来自man xargs

    xargs - 从标准输入构建和执行命令行

    要全面了解管道的工作原理,您可以阅读What is a simple explanation for how pipes work in BASH?

    一个 Unix 管道连接 STDOUT(标准输出)文件描述符 第一个进程到第二个的STDIN(标准输入)。什么 然后发生的是,当第一个进程写入其 STDOUT 时, 第二个进程可以立即(从 STDIN)读取输出。

    【讨论】:

      【解决方案2】:

      ls 不会从标准输入读取其参数,而是从命令行读取。要在命令行获取目录,您必须使用命令替换:

      ls -l "$( which studio )"
      

      (如果路径可能包含空格,则需要双引号。)

      【讨论】:

      • 涉及xargs 的答案更清晰,但这尊重了我的shell 的颜色编码,这是一个不错的选择!
      • @Dannid 当我尝试 xargs 时,我得到了 Too many errors from stdin ,但这个答案对我很有效。
      • 我怎么知道一个命令是从标准输入还是命令行读取它的参数?
      • @Tengerye:阅读它的文档。
      【解决方案3】:

      由于ls -l 不接受任何输入,它不会对which studio 的输出做任何事情。这里重要的是理解标准输入和参数之间的区别。标准输入是使用scanf 过程读取的特殊文件(例如由C 中的程序),程序的参数作为argvargc 参数传递给主过程。 argv 是一个以空字符结尾的 char 数组的数组,argc 是该数组的长度。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-02-28
        • 2013-10-23
        • 1970-01-01
        • 2016-06-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多