2011-06-15 53 views
0

這困擾了我多年來的開關。任何人都可以解釋爲什麼$(HOSTNAME)不擴展到環境值HOSTNAME?谷歌搜索「make」,「hostname」,「gmake」,「未設置」等等的各種組合對我而言並沒有成果。HOSTNAME在環境中設置但不可見gmake

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

[email protected]:/tmp$ make USER.test 
set | grep USER 
BASH_EXECUTION_STRING='set | grep USER' 
USER=jcomeau 
[email protected]:/tmp$ make USER.env 
echo jcomeau 
jcomeau 

回答

4

這是shell變量和環境變量的區別。嘗試在測試之前運行「導出HOSTNAME」並查看其差異。

另外,比較「set」和「env」之間的輸出差異。

+0

謝謝! :開明: – 2011-06-15 04:54:09

2

當您在shell中啓動子進程時(可能通過運行make命令),它會繼承shell的原始環境變量以及shell中的所有「已導出」變量。如果外殼的原始環境沒有$ HOSTNAME且$ HOSTNAME沒有被導出,它將不在產生的進程的環境中。

運行export查看導出變量的列表。在我的系統中,$ HOSTNAME默認不在導出中。如果您希望HOSTNAME在衍生進程中可用,您可以在命令行上或在.bashrc /配置文件中使用export HOSTNAME

0

如果你要導出的主機名,你可以使用:

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