Остерегайтесь таких рецептов
target:
MY_ID=$(GENERATE_ID);
echo $MY_ID;
Он делает две вещи неправильно. Первая строка в рецепте выполняется в отдельном экземпляре оболочки от второй строки. Переменная тем временем теряется. Во-вторых, неправильно то, что $
не удалось избежать.
target:
MY_ID=$(GENERATE_ID); \
echo $$MY_ID;
Обе проблемы были исправлены, и переменная может использоваться. Обратная косая черта объединяет обе строки в одну оболочку, поэтому установка переменной и чтение послесловия переменной работает.
Я понимаю, что в оригинальном сообщении говорилось, как получить результаты команды оболочки в переменную MAKE, и этот ответ показывает, как получить ее в переменную оболочки. Но другие читатели могут извлечь выгоду.
Одно из последних улучшений: если потребитель ожидает, что будет установлена «переменная среды», вам придется ее экспортировать.
my_shell_script
echo $MY_ID
понадобится это в make-файле
target:
export MY_ID=$(GENERATE_ID); \
./my_shell_script;
Надеюсь, что это помогает кому-то. В целом, следует избегать какой-либо реальной работы вне рецептов, потому что если кто-то использует make-файл с опцией --dry-run, чтобы только ВИДЕТЬ, что он будет делать, у него не будет никаких нежелательных побочных эффектов. Каждый $(shell)
вызов оценивается во время компиляции, и некоторая реальная работа может быть выполнена случайно. Лучше оставить реальную работу, такую как создание идентификаторов, внутри рецептов, когда это возможно.