Как использовать переменные оболочки в действиях Makefile?
У меня есть следующее в Makefile с целью воссоздания моей базы данных, в том числе уничтожения, если это необходимо. Это не работает.
.PHONY: rebuilddb
exists=$(psql postgres --tuples-only --no-align --command "SELECT 1 FROM pg_database WHERE datname='the_db'")
if [ $(exists) -eq 1 ]; then
dropdb the_db
fi
createdb -E UTF8 the_db
При запуске это приводит к ошибке:
$ make rebuilddb
exists=
if [ -eq 1 ]; then
/bin/sh: -c: line 1: syntax error: unexpected end of file
make: *** [rebuilddb_postgres] Error 2
Почему это неправильно? Насколько я могу это сказать? Существуют ли особые соображения, которые я должен сделать при выполнении этого в Makefile?
UPDATE:
Используя ответ, я пришел к рабочей версии:
.PHONY: rebuilddb
exists=$$(psql postgres --tuples-only --no-align --command "SELECT 1 FROM pg_database WHERE datname='the_db'"); \
if [ "$$exists" == "1" ]; then \
dropdb the_db; \
fi;
createdb -E UTF8 the_db
Ответы
Ответ 1
Существует по крайней мере два соображения. $()
ссылается на переменную Make. Вы должны избежать $
, чтобы выполнить подстановку команд. Кроме того, команды оболочки должны быть в одной строке. Попробуйте:
exists=$$(psql postgres --tuples-only --no-align --command "SELECT 1 FROM \
pg_database WHERE datname='the_db'"); \
if [ "$$exists" -eq 1 ]; then \
dropdb the_db; \
fi; \
createdb -E UTF8 the_db
С другой стороны, похоже, было бы проще просто попытаться сбросить базу данных и разрешить сбой:
rebuilddb:
-dropdb the_db # Leading - instructs make to not abort on error
createdb -E UTF8 the_db