我在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
至少有两个考虑因素. $()引用一个Make变量.您必须逃避$才能做过程替换.此外,shell命令必须全部在一行上.尝试:
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