HOSTNAME задано в среде, но не отображается для gmake

Это преследовало меня на протяжении многих лет. Кто-нибудь может объяснить, почему $(HOSTNAME) не расширяется до значения среды HOSTNAME? Поиск в Google различных комбинаций «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

person jcomeau_ictx    schedule 15.06.2011    source источник


Ответы (3)


В этом разница между переменной оболочки и переменной окружения. Попробуйте запустить «export HOSTNAME» перед тестом и увидите разницу.

Кроме того, сравните разницу в выводе между «set» и «env».

person cxreg    schedule 15.06.2011

Когда вы запускаете подпроцесс в оболочке (например, запуская команду make), он наследует исходные переменные среды оболочки, а также все «экспортированные» переменные внутри оболочки. Если в исходной среде оболочки не было $HOSTNAME и $HOSTNAME не было экспортировано, она не будет находиться в среде порожденного процесса.

Запустите export, чтобы увидеть список экспортированных переменных. В моей системе $HOSTNAME по умолчанию отсутствует в экспорте. Если вы хотите, чтобы HOSTNAME был доступен в порожденном процессе, вы можете export HOSTNAME в командной строке или в своем .bashrc/profile.

person lunixbochs    schedule 15.06.2011

Если вы хотите экспортировать имя хоста, вы можете использовать:

export SERVERIP=$(hostname --ip-address)
echo $SERVERIP
person Dimitrios    schedule 22.05.2013
comment
Это экспорт IP-адреса, а не имени хоста - person AmaelH; 15.02.2021