【问题标题】:bash command output as parametersbash 命令输出作为参数
【发布时间】:2017-03-16 14:05:59
【问题描述】:

假设命令alpha 产生这个输出:

a b c
d

如果我运行命令

beta $(alpha)

那么beta将使用四个参数执行,"a""b""c""d"

但是如果我运行命令

beta "$(alpha)"

然后beta 将使用一个参数"a b c d" 执行。

为了使用"a b c""d" 这两个参数执行beta,我应该写什么。也就是说,如何强制$(alpha)alpha 的每个输出行返回一个参数?

【问题讨论】:

    标签: bash parameters


    【解决方案1】:

    你可以使用:

    $ alpha | xargs -d "\n" beta
    

    【讨论】:

      【解决方案2】:

      类似于 anubhava 的回答,如果您使用的是bash 4 或更高版本。

      readarray -t args < <(alpha)
      beta "${args[@]}"
      

      【讨论】:

        【解决方案3】:

        bash 中分两步完成:

        IFS=$'\n' read -d '' a b < <(alpha)
        
        beta "$a" "$b"
        

        示例:

        # set IFS to \n with -d'' to read 2 values in a and b
        IFS=$'\n' read -d '' a b < <(echo $'a b c\nd')
        
        # check a and b
        declare -p a b
        declare -- a="a b c"
        declare -- b="d"
        

        【讨论】:

          【解决方案4】:

          脚本 beta.sh 应该可以解决您的问题:

          $ cat alpha.sh
          #! /bin/sh
          echo -e "a b c\nd"
          
          $ cat beta.sh
          #! /bin/sh
          OIFS="$IFS"
          IFS=$'\n'
          for i in $(./alpha.sh); do
              echo $i
          done
          

          【讨论】:

          • 这也会使./alpha.sh 的输出生成路径名,这可能是不可取的。
          • @chepner。减一,为什么?这是一个简单的例子来展示如何解决这个问题,并且它有效。显然 alpha.sh 可以在 PATH 目录中,然后您可以避免使用“./”,但我想将注意力集中在解决问题上而不是次要问题上......
          • 如果alpha 可以输出像a * c 这样的行,它不起作用。这不是次要问题。
          • 拜托,你能提供一个带有 echo 失败的示例字符串吗?我更喜欢测试它
          • 它使用IFS,但与您完全不同。另请阅读mywiki.wooledge.org/DontReadLinesWithFor,这是页面上第一件事的链接。
          猜你喜欢
          • 2012-03-27
          • 2012-10-25
          • 2017-01-13
          • 1970-01-01
          • 2011-07-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多