Mam plik Makefile w celu odtworzenia mojej bazy danych, w tym w razie potrzeby jej zniszczenia. To nie działa.Jak używać zmiennych powłoki w akcjach 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
Running to powoduje błąd:
$ make rebuilddb
exists=
if [ -eq 1 ]; then
/bin/sh: -c: line 1: syntax error: unexpected end of file
make: *** [rebuilddb_postgres] Error 2
Dlaczego to jest złe? Wygląda na prawidłowy Bash, o ile mogę powiedzieć? Czy są specjalne względy, które muszę zrobić, robiąc to w Makefile?
UPDATE:
Korzystanie odpowiedź przyjechałem w wersji roboczej:
.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
Istnieje jeszcze kilka niuansów o „wszystko na jedna linia ", o której warto dyskutować: (tradycyjnie i przenośnie) wszystko, co chcesz wykonać za pomocą ** tej samej powłoki **, musi być w jednej linii logicznej _make_. Więc 'exists = ...' i 'if ... fi' musi być wykonane w pojedynczym wierszu poleceń ze średnikami i odwróconymi ukośnikami, ale' createdb ... 'może z radością pozostać jako oddzielne drugie polecenie w recepturze. –
Dla czytelnika: Upewnij się, że umieściłeś '\' na końcu twojego 'VAR =" foo "\' statement – redolent
"Wszystko w jednym wierszu" można rozluźnić, używając '.ONESHELL:' jak opisano w https: //www.gnu.org/software/make/manual/html_node/One-Shell.html#One- Shell – sdive