Gerektiğinde imha etmek de dahil olmak üzere veritabanımı yeniden oluşturmak amacıyla Makefile'de aşağıdakiler var. İşe yaramıyor.Makefile eylemlerinde kabuk değişkenlerini nasıl kullanırım?
.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
Koşu o hatayla sonuçlanır:
$ make rebuilddb
exists=
if [ -eq 1 ]; then
/bin/sh: -c: line 1: syntax error: unexpected end of file
make: *** [rebuilddb_postgres] Error 2
Bu neden yanlış? Anlatabildiğim kadarıyla geçerli Bash'e benziyor mu? Makefile'de bunu yaparken yapmam gereken özel hususlar var mı? Ben çalışan bir sürümü geldi cevabı kullanarak
:
GÜNCELLEME
.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
birkaç nüansları bir satır "tartışmaya değer: (geleneksel ve portably) ** aynı kabuk ** tarafından yürütülmesini istediğiniz her şey bir mantıksal _make_ satırında olmalıdır. Yani '' var = ... 've' eğer ... 'fi', noktalı virgüller ve ters eğik çizgilerle tek bir komut satırında yapılmalı, fakat 'yaratılmışb' ... tarifi içinde mutlu bir şekilde ayrı bir ikinci komut olarak kalabilir. –
Okuyucuya: '' '' 'VAR = 'foo' 'ifadesinin sonuna koyduğunuzdan emin olun \' ifadesi – redolent
"Hepsi bir satırda", https:' de açıklandığı gibi '.ONESHELL:' kullanılarak rahatlayabilir: //www.gnu.org/software/make/manual/html_node/One-Shell.html#One-Shell – sdive