从bash脚本

时间:2016-08-17 20:33:19

标签: linux bash shell variables makefile

我有一个makefile,其中我试图设置一些已经存在于我编写的bash脚本中的变量:set-vars.sh(它只包含变量名和值)。

我在其他几个bash脚本中使用这些变量。我还需要能够在makefile中使用它们。

经过大量研究并试图找出bashmakefile脚本设置变量的最佳方法,我发现了一种有效的方法;如下:

set-vars.sh

# set vars
foo=FOO1
bar=BAR1
baz=BAZ1

# if a command line arg is given (e.g. foo) 
# echo value command line arg (e.g. echo $foo)

if ! [ -z ${1+x} ]; then echo ${!1}; fi

这里的魔力是echo es的一个变量值的最后一行,如果有一个命令行参数,则该变量的名称在命令行参数中提供。我在makefile中调用此脚本并提供变量名称,并使用echo ed值设置makefile变量。

Makefile

.PHONY:  target1 target2 target3

export foo = $(shell sh set-vars.sh foo)

target1:
    @echo $(foo)

# ... other targets which reference $(foo) ...

这很有效,但它可能是一种 hacky 方式。我想知道是否有一种更简单,更优雅的方式来做我想做的事。

我在StackOverflow上遇到过几个类似的问题和答案,但没有找到适用于我的示例的任何内容。如果我已经错过了答案,请指出。

非常感谢!

3 个答案:

答案 0 :(得分:3)

您可以在一个文件中定义变量,该文件可以从您的shell脚本中获取并包含在Makefile中:

$ cat vardef.txt
foo=FOO1
bar=BAR1
baz=BAZ1
$ cat set-vars.sh
source ./vardef.txt
echo "$foo $bar $baz"
$ sh ./set-vars.sh
FOO1 BAR1 BAZ1
$ cat Makefile
include vardef.txt
all:
    @echo "$(foo) $(bar) $(baz)"
$ make
FOO1 BAR1 BAZ1

当两种语言部分使用相同的语法时,它真的很棒吗?

答案 1 :(得分:1)

不确定它是否不那么hacky,但你可以“创建”一个可以包含在Makefile中的文件。在运行时。像这样:

$(shell grep '=' vars.sh > /tmp/vars.tmp)
include /tmp/vars.tmp
$(shell rm /tmp/vars.tmp)

用更健全的东西替换第一行。

答案 2 :(得分:1)

通常认为构建系统依赖于环境变量的做法很糟糕,因为如果它们确实存在重复性问题,那么输出不仅取决于命令行,还取决于环境变量的状态。

警告过您,所有环境变量都可以在make中访问,例如:

user := ${USER} # ${USER} comes from the environment.
all :
    @echo ${user}

换句话说,有一个脚本设置环境变量并调用make

#!/bin/bash
export foo=FOO1
export bar=BAR1
export baz=BAZ1
exec make "$@"

或者,您可以使用仅包含export foo=FOO1语句的shell脚本。结果证明这是有效的makefile语法,因此您可以在include set-vars.sh中执行Makefile