45

必要に応じてデータベースを破棄するなど、データベースを再作成する目的で、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

なぜこれが間違っているのですか?私が知る限り、有効な Bash のように見えますか? Makefile でこれを行う場合、特別な考慮事項はありますか?

アップデート:

答えを使用して、作業バージョンにたどり着きました:

.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
4

2 に答える 2

57

少なくとも 2 つの考慮事項があります。 $()Make 変数を参照します。$to do コマンド置換をエスケープする必要があります。また、シェル コマンドはすべて 1 行に収める必要があります。試す:

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
于 2012-12-08T05:40:21.727 に答える