【问题标题】:Linux Command : Why does the redirection operator - | i.e. piping fail here?Linux 命令:为什么重定向操作符 - |即管道在这里失败?
【发布时间】:2015-04-17 06:52:54
【问题描述】:

我正在阅读有关 Shell (Bash) 脚本的入门知识,但有以下疑问:

  • 为什么下面的命令不打印cp's目录的内容:which cp | ls -l

  • 根据定义不管道是否意味着我们将一个命令的输出传递给另一个命令,即重定向输出?

有人可以帮帮我吗?我是新手..

【问题讨论】:

    标签: linux bash shell pipe sh


    【解决方案1】:

    which 的输出通过管道传送到ls 的标准输入。但是,ls 不接受任何标准输入。您希望它(我认为)作为参数传递。有几种方法可以做到这一点:

    which cp | xargs ls -l
    

    ls -l `which cp`
    

    ls -l $(which cp)
    

    在第一个示例中,xargs 命令采用前一个命令的标准输出,并将每一行作为名称紧跟在xargs 之后的命令的参数。所以,例如

    find / | xargs ls -l
    

    将对文件系统中的每个文件执行ls -l (对于特殊命名的文件存在一些问题,但这超出了此答案的范围)。

    其余两个大致等效,并使用 shell 来执行此操作,将输出从 which 扩展到 cp 的命令行。

    【讨论】:

    • 嗨,@abligh,非常感谢;我怎么知道 ls 没有从 STDIN 中获取任何东西?
    • 一个答案:阅读手册页。更好的答案:当您键入ls -l /path/to/file 并按回车时,该命令是否等待您通过键盘提供更多数据?不,它没有。像tr a z 这样的东西会。
    • 谢谢@abligh,就这样:)
    • 回答你的第二个要点;是的,这就是它的作用。例如,您可以使用which cp | nlnl 对其接收的行进行编号。这是读取和处理其标准输入的命令的另一个示例;其他流行的例子有headtailsedtacread等。
    • 谢谢@tripleee :) ;我可以问你,从头开始建立全面的 bash 知识的好方法是什么?希望我不会打扰:)
    【解决方案2】:

    会的,

    $ ls -l $(which cp)
    -rwxr-xr-x 1 root root 130304 Mar 24  2014 /bin/cp
    

    $ which cp | xargs ls -l
    -rwxr-xr-x 1 root root 130304 Mar 24  2014 /bin/cp
    

    要将一个命令的输出作为另一个命令的参数传递,您需要使用xargs 和管道符号。

    来自man xargs

    xargs - 从标准输入构建和执行命令行。xargs 读取项目 来自标准输入,由空格分隔(可以保护 带双引号或单引号或反斜杠)或换行符,并执行 该命令(默认为 /bin/echo)一次或多次,带有任何初始 - 参数后跟从标准输入读取的项目。上的空行 标准输入被忽略。

    【讨论】:

    • 谢谢@AvinashRaj :)
    猜你喜欢
    • 2018-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-18
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    相关资源
    最近更新 更多