#bash #makefile
#bash #makefile
Вопрос:
Я использую makefile для развертывания статического содержимого в корзине s3 с помощью командной строки Amazon. Я хочу добавить переменную для выбора целевого назначения, поэтому мне не нужно повторять один и тот же сценарий в разных глаголах make.
Кажется, я заставил это работать, но я хочу сделать аргумент нечувствительным к регистру из терминала при его выполнении. Вот что у меня есть:
S3_NAME_DEV = com-mydomain-application-dev
S3_NAME_LIVE = com-mydomain-application
deploy:
# e.g. make deploy t=LIVE
aws s3 sync dist/ s3://$(S3_NAME_${t})
Я попытался добавить две каретки (которые поддерживаются в bash 4 и которые я использую) $(S3_NAME_${t^^})
, но не работает:/. Вот результат, когда я это делаю $ make deploy t=live
(переменная просто исчезает).
$ make deploy t=live
# e.g. make deploy t=LIVE
aws s3 sync dist/ s3://
Я подумал, что было бы полезно указать, как может выглядеть команда aws (чтобы незнание интерфейса командной строки AWS не сбивало вас с толку).
aws s3 sync dist/ s3://com-mydomain-application
В оболочке, которую я вызываю make
, я могу сделать это успешно:
$ t=live
$ echo ${t^^}
LIVE
Любая помощь была бы весьма признательна.
Бонусные баллы: установка значения по умолчанию
Обновить:
Таким образом, make не наследует bash, который выполняет его, как я предполагал. Если я @echo "my version is: $$BASH_VERSION"
в файле make, я получаю версию 3.2 (OS X по умолчанию). Довольно хороший шанс, что исправление этого решит проблему.
Комментарии:
1. @Sundeep Извините, что я не включил это; я отредактировал сообщение.
2. без проблем, сработает ли это, если вы дадите все заглавные буквы?
3.@Sundeep как только я включу
^^
is, он выдаст пустое значение либо сt=live
помощью ort=LIVE
. Если я удалю^^
$ make deploy t=LIVE
, будет работать снова.4. хорошо, ты можешь попробовать
$(S3_NAME_"${t^^}")
?5. @Sundeep попробовал. К сожалению, тот же результат.
Ответ №1:
Я попытался добавить две каретки (которые поддерживаются в bash 4 и которые я использую)
$(S3_NAME_${t^^})
, но не работает.
Это связано с тем, что $(S3_NAME_...)
часть расширяется с помощью make, тогда как вы ожидаете ${t^^}
, что часть будет расширена bash
, но bash
не задействована при make
расширении переменных.
Преобразуйте t
в верхний регистр в начале вашего makefile:
override t := $(shell X="${t}"; echo $${X^^})
Без override
этого потребуется новое имя переменной:
u := $(shell X="${t}"; echo $${X^^})
# use ${u} instead of ${t}
Комментарии:
1. Это работает, хотя сценарий make, похоже, не имеет контекста ранее выполненных строк, поэтому я должен делать все это встроенным, т. Е.
aws s3 sync dist/ s3://S3_NAME_$(shell X="${t}"; echo $${X^^})
. Я прав, что это так2. @freebie сценарий make, похоже, не имеет контекста ранее выполненных строк — этого не должно быть. Если вы вызываете другие файлы makefile, убедитесь, что вы
export
используете переменную, напримерexport u := ...
, и используйте${u}
вместо${t}
.3. Я попытался поместить export перед присваиванием переменной, но, похоже, это не сработало. Извините за мой телефон, поэтому у меня нет ошибки. Этот ответ правильный, хотя и решил мою проблему. Я предполагаю, что область действия переменных make — это другая проблема. Спасибо