2017-11-10 206 views
0

我正在尝试编写make目标,它设置了env。由shell命令获得的变量。Makefile:设置命令输出的环境变量

gcloud beta emulators datastore env-init命令在终端输出很少的导出语句像(不设置,但只是回声/打印)。

export DATASTORE_EMULATOR_HOST=localhost:8432 
export DATASTORE_PROJECT_ID=my-project-id 

通常,我必须将这些行复制并粘贴到终端中以设置变量。

是否可以使这些打印的export语句执行,以便它们将在shell中设置。我尝试过,但没有奏效。

target: 
    @export JAVA_HOME=$(JAVA_HOME); \ 
    $(shell gcloud beta emulators datastore env-init); \ 
    go run src/main.go 

它打印出的脚本输出,如果我不喜欢,

target: 
    export JAVA_HOME=$(JAVA_HOME); \ 
    gcloud beta emulators datastore env-init \ 
    go run src/main.go 

JAVA_HOME类似,哪能还gcloud beta emulators datastore env-init命令(其是4线出口的命令)的源极输出,使他们在环境中设置。

,所以我想是这样,实际上,

target: 
     export JAVA_HOME=$(JAVA_HOME); \ 
     export DATASTORE_EMULATOR_HOST=localhost:8432 \ 
     export DATASTORE_PROJECT_ID=my-project-id \ 
     go run src/main.go 

感谢。 bsr

回答

1

make打印的输出实际上不会影响子过程的环境内容。

如果变量赋值看起来没有任何作用,那是因为make在单独的子shell中运行每一行,每个子行都有新的环境。你需要加入的命令一起这样的:

target: 
    export JAVA_HOME=$(JAVA_HOME); \ 
    eval "$$(gcloud beta emulators datastore env-init)"; \ 
    go run src/main.go 

eval是必要的,这样的gcloud命令的输出在当前shell进行评估,而不是一个子shell。还要注意配方第二行末尾的分号。

+0

所以我试过了,'''target: @export JAVA_HOME = $(JAVA_HOME); \ gcloud beta模拟器数据存储env-init \ 运行src/main.go'''但仍然是env。未设置'gcloud'命令打印的变量。 – bsr

+0

对不起,我可能听错了。稍作编辑以澄清问题。它不是跟踪,而是设置(导出)由命令打印的变量(gcloud beta ...)。所以这个命令的输出是2个输出状态(只输出到控制台,但没有设置)。我想设置这些变量,然后在下一行(同一个shell)上启动一个命令。我不介意将它设置为makefile级别,但该env变量仅在执行目标之前可用。是否可以在执行目标之前对命令进行评估。谢谢您的帮助。 – bsr

+0

非常感谢你。我最初没有看到你的编辑:-),它效果很好。感谢你的宝贵时间。 – bsr