多年来,这一直困扰着我。任何人都可以解释为什么$(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
答案 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