Подтвердить что ты не робот

Как использовать переменные оболочки в действиях 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
4b9b3361

Ответ 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