HOSTNAME在环境中设置但对gmake不可见

时间:2011-06-15 04:37:13

标签: bash makefile environment-variables gnu-make

多年来,这一直困扰着我。任何人都可以解释为什么$(HOSTNAME)没有扩展到环境值HOSTNAME?谷歌搜索“make”,“hostname”,“gmake”,“not set”等各种组合对我来说并不富有成效。

jcomeau@intrepid:/tmp$ set | egrep 'HOSTNAME|USER'
HOSTNAME=intrepid
USER=jcomeau
jcomeau@intrepid:/tmp$ cat Makefile 
%.test:
    set | grep $*
%.env:
    echo $($*)
jcomeau@intrepid:/tmp$ make HOSTNAME.test
set | grep HOSTNAME
BASH_EXECUTION_STRING='set | grep HOSTNAME'
HOSTNAME=intrepid
jcomeau@intrepid:/tmp$ make HOSTNAME.env
echo 

jcomeau@intrepid:/tmp$ make USER.test
set | grep USER
BASH_EXECUTION_STRING='set | grep USER'
USER=jcomeau
jcomeau@intrepid:/tmp$ make USER.env
echo jcomeau
jcomeau

3 个答案:

答案 0 :(得分:4)

这是shell变量和环境变量之间的区别。尝试在测试前运行“导出HOSTNAME”并查看差异。

另外,比较“set”和“env”之间的输出差异。

答案 1 :(得分:2)

当你在shell中启动子进程时(可能通过运行make命令),它继承了shell的原始环境变量,以及shell内部的所有“导出”变量。如果shell的原始环境没有$ HOSTNAME并且未导出$ HOSTNAME,则它将不在生成进程的环境中。

运行export以查看导出变量的列表。在我的系统上,默认情况下$ HOSTNAME不在导出中。如果您希望HOSTNAME在生成的进程中可用,您可以在命令行上或{.bashrc / profile中export HOSTNAME

答案 2 :(得分:0)

如果要导出主机名,可以使用:

export SERVERIP=$(hostname --ip-address)
echo $SERVERIP