Bash 主机名已在环境中设置,但对gmake不可见

Bash 主机名已在环境中设置,但对gmake不可见,bash,makefile,environment-variables,gnu-make,Bash,Makefile,Environment Variables,Gnu Make,这几年来断断续续地折磨着我。有人能解释一下为什么$(HOSTNAME)没有扩展到环境值HOSTNAME吗?在谷歌上搜索“make”、“hostname”、“gmake”、“notset”等各种组合对我来说并没有什么成效 jcomeau@intrepid:/tmp$ set | egrep 'HOSTNAME|USER' HOSTNAME=intrepid USER=jcomeau jcomeau@intrepid:/tmp$ cat Makefile %.test: set | gre

这几年来断断续续地折磨着我。有人能解释一下为什么
$(HOSTNAME)
没有扩展到环境值HOSTNAME吗?在谷歌上搜索“make”、“hostname”、“gmake”、“notset”等各种组合对我来说并没有什么成效

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

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


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

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


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

在shell中启动子进程时(可能通过运行
make
命令),它继承shell的原始环境变量,以及shell内部的所有“导出”变量。如果shell的原始环境没有$HOSTNAME,并且$HOSTNAME没有导出,那么它就不会位于派生进程的环境中


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

在shell中启动子进程时(可能通过运行
make
命令),它继承shell的原始环境变量,以及所有“导出的”来自shell内部的变量。如果shell的原始环境没有$HOSTNAME,并且$HOSTNAME没有导出,那么它就不会位于派生进程的环境中


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

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

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

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

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

这是导出IP地址而不是主机名这是导出IP地址而不是主机名