Как экспортировать переменную env из сценария оболочки в текущий экземпляр оболочки с помощью MAKEFILE - PullRequest
0 голосов
/ 08 июля 2020

В моем make-файле я хотел бы вызвать сценарий оболочки с помощью оператора .PHONY. В моем сценарии оболочки я экспортирую переменную и ожидаю, что она будет экспортирована в текущие экземпляры оболочки. Make target работает нормально, но переменная не отображается в текущей оболочке.

Makefile

$ cat Makefile 
.PHONY: configure-mytest-path
configure-mytest-path:
        . ./scripts/test.sh

сценарий оболочки, который я использую через make target

$ cat scripts/test.sh 
#!/bin/bash
set -x

export MYTESTPATH=/Users/myname/go/mytestpath

Проверка значения переменной

$ echo $MYTESTPATH

Запуск цели

$ make configure-mytest-path
. ./scripts/test.sh
++ export MYTESTPATH=/Users/myname/go/mytestpath
++ MYTESTPATH=/Users/myname/go/mytestpath

Проверка значения переменной.

$ echo $MYTESTPATH

Я ожидаю, что echo $MYTESTPATH должен напечатать /Users/myname/go/mytestpath но он печатается пустым. Я что-нибудь пропустил? или это не способ экспорта переменной в текущий экземпляр оболочки?

Спасибо за понимание

1 Ответ

3 голосов
/ 08 июля 2020

Невозможно делать то, что вы хотите.

Среда процесса создается и передается ей его родителем. После запуска дочернего процесса его окружение становится полностью его собственным. Он не может быть изменен его родителем, а также не может быть изменен никакими дочерними элементами, которые он создает. У дочерних элементов будут свои собственные копии среды, и они смогут их изменять, но они не будут влиять на родительский. программа make, затем make запустит новую оболочку, которая запустит рецепт.

Эта третья программа просто не может изменить среду первой программы. Он даже не может изменить среду второй программы (make).

Способ only изменить среду первой программы (вашей оболочки) - использовать . ./scripts/test.sh в этой программе (вместо запуска make).

Если вы запустите ./scripts/test.sh, он также не будет работать: это запустит новую оболочку, новая оболочка запустится этот сценарий и установите переменную среды, тогда новая оболочка выйдет, и ваша первая оболочка все равно не изменит свою среду.

Команда . - это специальная команда оболочки, которая означает: не запускать новая оболочка для запуска этого сценария оболочки; вместо этого запустите команды, содержащиеся в файле в текущей оболочке , как если бы вы набрали их в приглашении оболочки.

В bash вы можете использовать source в качестве псевдонима для . и введите source ./scripts/test.h, потому что некоторым людям легче понять: они означают одно и то же.

Вы также можете создать для этого функцию оболочки или псевдоним оболочки, потому что они также запускаться в том же процессе оболочки, а не в дочернем процессе.

Но нет возможности сделать это через make-файл или с помощью make.

...