Переменная доступа, объявленная внутри команды Makefile

Я пытаюсь получить доступ к переменной, объявленной предыдущей командой (внутри Makefile).

ВотMakefile:

all:
  ./script1.sh
  ./script2.sh

Вот скрипт, объявляющий переменную, к которой я хочу получить доступ,script1.sh:

#!/usr/bin/env bash
myVar=1234

Вот скрипт, пытающийся получить доступ к ранее определенной переменной,script2.sh:

#!/usr/bin/env bash
echo $myVar

К сожалению когда я бегуmake, myVar не доступен Есть ли другой путь? Благодарю.

Ответы на вопрос(2)

ипт устанавливает переменную в своей среде и завершает работу (среда теряется). Второй сценарий не имеет этой переменной в своей среде, поэтому он выводит пустую строку.

Нельзя, чтобы переменные среды передавались между средами, отличными от сред родительской оболочки, в дочернюю (не наоборот). Переменные, передаваемые в дочернюю оболочку:только те, которые есть у родительской оболочкиexport-ed. Таким образом, если первый сценарий вызвал второй сценарий, значение будет выведено (если оно былоexportв первом сценарии).

В оболочке вы быsource первый файл для установки переменных в текущей среде (а затемexport их!). Тем не менее, в Makefiles это немного сложнее, так как нет удобногоsource команда.

Вместо этого вы можете прочитатьэтот вопрос StackOverflow.

РЕДАКТИРОВАТЬ в свете ответа @ ghotiУ @ghoti есть хорошее решение, но я оставлю здесь свой ответ, так как он объясняет немного более подробно о переменных среды и о том, что мы можем делать, а не делать с ними в отношении передачи их между средами.

 julesbou23 июн. 2016 г., 15:45
это то, что я подумал, спасибо большое
Решение Вопроса

чке. И когда оболочка выходит, ее среда теряется.

Если вы хотите, чтобы переменные из одного скрипта были доступны в следующем, есть конструкции, которые это сделают. Например:

all:
    ( . ./script1.sh; ./script2.sh )

Это заставляет Make запускать одну оболочку для обработки обоих сценариев.

Обратите внимание, что вам нужно будетэкспорт переменная для того, чтобы она была видна во втором скрипте; Неэкспортированные переменные доступны только для локального сценария, а не для вспомогательных оболочек, которые он запускает.

ОБНОВИТЬ (согласно комментарию Кусалананды):

Если вы хотите, чтобы ваши команды оболочки заполняли переменные MAKE, а не просто переменные окружения, у вас могут быть параметры, которые зависят от версии Make, которую вы используете. Например, в BSD make и GNU make вы можете использовать «модификаторы назначения переменных», включая (из справочной страницы BSD make):

 !=      Expand the value and pass it to the shell for execution and
         assign the result to the variable.  Any newlines in the result
         are replaced with spaces.

Таким образом, с BSD make и GNU make вы можете сделать это:

$ cat Makefile

foo!=   . ./script1.sh; ./script2.sh

all:
    @echo "foo=${foo}"

$
$ cat script1.sh
export test=bar
$
$ cat script2.sh
#!/usr/bin/env bash

echo "$test"
$
$ make
foo=bar
$

Обратите внимание, чтоscript1.sh не включает в себя какой-либо Шебанг, потому что этоSourcedи, следовательно, работает в вызывающей оболочке, что бы это ни было. Это делает линию Шебанга просто комментарием. Если вы работаете в системе, в которой оболочкой по умолчанию является POSIX, а не bash (например, Ubuntu, Solaris, FreeBSD и т. Д.), Это все равно должно работать, поскольку все оболочки POSIX должны понимать концепцию экспорта переменных.

 Kusalananda23 июн. 2016 г., 15:56
Это хорошо работает. Однако переменные недоступны вне оболочки, созданной( ... ), Это не может быть проблемой для ОП, хотя ... Строго говоря, это то же самое, что иметьscript3.sh исходный код первого скрипта и второй. Это больше не «внутри Makefile» в этот момент.
 Kusalananda23 июн. 2016 г., 17:08
Это хорошее решение.
 tripleee07 апр. 2018 г., 20:04
Скобки в первом примере не нужны и немного неэффективны. Нет необходимости запускать оболочку с подоболочкой.
 ghoti23 июн. 2016 г., 17:06
@Kusalananda - обновлено решением, которое заполняет make-переменные в BSD и GNU make. Не работает со всеми вариантами, но, по крайней мере, это что-то. :)

Ваш ответ на вопрос