Как получить переменную среды оболочки в make-файле?


105

В оболочке, когда я вхожу

echo $demoPath

это печатает

/usr/local/demo

Как я могу получить значение этой переменной $demoPathв make-файле?

Ответы:


157

Если вы экспортировали переменную среды:

export demoPath=/usr/local/demo

вы можете просто сослаться на него по имени в makefile( makeимпортирует все заданные вами переменные среды):

DEMOPATH = ${demoPath}    # Or $(demoPath) if you prefer.

Если вы не экспортировали переменную среды, она будет недоступна, пока вы ее не экспортируете или если вы не передадите ее явно в командной строке:

make DEMOPATH="${demoPath}" 

Если вы используете производную C оболочки, замену setenv demoPath /usr/local/demoдля exportкоманды.


3
"make импортирует все заданные вами переменные среды". Это работает! Приятно ~, я понятия не имел об этом раньше, большое спасибо.
Jialin

@jonathan_leffler Меня вдохновил ваш ответ, и я сделал кое-что другое. Я поставил envvar перед вызовом сделайте без его экспорта: demoPath=/usr/local/demo make. Вы можете проверить это и, возможно, обновить свой ответ. Ура!
AD

@AD Да, это еще один механизм для установки значения переменной среды для конкретной команды. Это немного косвенно по отношению к вопросу, который спрашивает, как получить доступ к значению существующей переменной, а не как создать ее на лету. Иногда это не перестает быть полезной техникой.
Джонатан Леффлер

11

для тех, кому нужен официальный документ, подтверждающий поведение

Переменные в make могут поступать из среды, в которой выполняется make. Каждая переменная среды, которую программа make видит при запуске, преобразуется в переменную make с тем же именем и значением. Однако явное присвоение в make-файле или с помощью аргумента команды отменяет среду. (Если указан флаг '-e', тогда значения из среды переопределяют назначения в make-файле.

https://www.gnu.org/software/make/manual/html_node/Environment.html


6
all:
    echo ${PATH}

Или измените PATH только для одной команды:

all:
    PATH=/my/path:${PATH} cmd
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.