【问题标题】:Bash pipes not working with my scripts [duplicate]Bash管道不适用于我的脚本[重复]
【发布时间】:2013-11-17 13:17:05
【问题描述】:

我写了两个脚本。一个是myscipt1.sh,它读取一个整数序列(作为参数提供)并报告一个最终数字:

[user@pc user] ./myscript1.sh 34 45 67 234
[user@pc user] 1200

在上面的例子中,脚本返回1200。 另一个脚本myscript2.sh 将一个字符串作为输入并返回一个整数序列:

[user@pc user] ./myscript2.sh a string to provide
[user@pc user] 364 465 786 34 22 1

我想通过传递myscript2.sh的结果来调用myscript1.sh,所以我尝试了:

[user@pc user] ./myscript2.sh my_string | ./myscript1.sh

但我没有运气,因为myscript1.sh(它会检查传递的参数数量,退出没有传递的参数)报告没有传递任何参数。

当我在编写的脚本中使用管道时,Bash 似乎有问题。怎么办?

【问题讨论】:

  • 但是像echols这样的命令可以在管道中使用...我不明白为什么...
  • echols 可以写入标准输出,因此出现在管道的 left 侧。它们可以出现在管道的右侧,但由于它们不从标准输入中读取,因此它们会忽略从管道接收到的任何内容,就像myscript1.sh 似乎正在做的那样。

标签: linux bash shell


【解决方案1】:

你可以这样运行它:

./myscript1.sh $(./myscript2.sh my_string)

【讨论】:

    【解决方案2】:

    使用xargs

    [user@pc user] ./myscript2.sh my_string | xargs ./myscript1.sh
    

    【讨论】:

      【解决方案3】:

      管道不是这样工作的。

      管道从程序/脚本获取输出并将其作为标准输入发送到另一个程序/脚本,作为命令行参数。例如,您可以使用readline 来读取从第一个程序通过管道传输的数据。

      您应该使用 xargs(正如 Joucks 在我写作时所说:))来做到这一点。

      【讨论】:

      • 感谢您的解释。现在我明白了:)
      【解决方案4】:

      如果您想要使用管道,那么重写您的脚本,以便他们期望输入不是作为参数而是从标准输入中读取:

      input=$1  # old version
      
      read input  # new version
      

      然后你可以像以前一样使用管道。

      【讨论】:

        猜你喜欢
        • 2021-09-08
        • 2023-03-15
        • 1970-01-01
        • 2023-03-22
        • 1970-01-01
        • 2016-05-09
        • 1970-01-01
        • 1970-01-01
        • 2018-10-09
        相关资源
        最近更新 更多