【问题标题】:Unable to set env variable before calling make in shell script在 shell 脚本中调用 make 之前无法设置环境变量
【发布时间】:2015-09-24 21:14:02
【问题描述】:

下面是我的脚本的 sn-p,它调用 make (GNU),尝试在调用 make 之前设置 VERSION 环境变量

#!/bin/bash
set -e
MY_VERSION="VERSION=1.0.0"

function build_target() {
   echo ${MY_VERSION} make
   ${MY_VERSION} make
   VERSION=1.0.0 make #this works when I comment out above line.
}
build_target

失败并出现错误

VERSION=1.0.0 make ./test.sh: line 7: VERSION=1.0.0: command not found

如代码中所说,当我注释掉第 7 行时,第 8 行运行良好,为什么不取从变量扩展的值?

【问题讨论】:

    标签: linux bash shell makefile


    【解决方案1】:

    ...当我注释掉第 7 行时,第 8 行运行良好,为什么不取从变量扩展的值?

    因为本地环境设置是 shell语法 的一部分,并且必须在命令行中可见,而不是由变量扩展或命令替换产生。总之,在

    ${MY_VERSION} make
    

    没有环境设置;环境设置的语法是NAME=WORD,该命令中没有=

    因此,shell 扩展并单词拆分 ${MY_VERSION},并使用扩展中的第一个单词 (VERSION=1.0.0) 作为要运行的命令实用程序的名称。

    【讨论】:

      【解决方案2】:

      选项包括将环境设置放在make 命令之后,

      $ cat Makefile 
      all:
              echo $(VERSION)
      $ cat mm
      #!/usr/bin/env bash
      set -e
      MY_VERSION="VERSION=1.0.0"
      
      function build_target() {
         make ${MY_VERSION}
      }
      build_target
      $ bash mm
      echo 1.0.0
      1.0.0
      $ 
      

      或者,使用env(1) 然后调用make,例如env ${MY_VERSION} make

      【讨论】:

        【解决方案3】:

        另一种选择:

        #!/bin/bash
        set -e
        MY_VERSION="1.0.0"
        
        function build_target() {
           echo VERSION=${MY_VERSION} make
           VERSION=${MY_VERSION} make
        }
        build_target
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-04
          • 1970-01-01
          • 2015-01-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多