2012-12-08 8 views
23

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 

cevap

38

en az iki hususlar vardır. $() referansları bir Make değişkeni. Komut değişimini yapmak için $'dan kaçmalısınız. Ayrıca, kabuk komutlarının hepsi bir satırda olmalıdır. Deneyin:

Öte yandan
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 

, bunun her zamanki veritabanını bırakma deneyin ve izin kolay olurdu gibi görünüyor hatası: tümü üzerinde" hakkında

vardır
rebuilddb: 
    -dropdb the_db # Leading - instructs make to not abort on error 
    createdb -E UTF8 the_db 
+3

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

+1

Okuyucuya: '' '' 'VAR = 'foo' 'ifadesinin sonuna koyduğunuzdan emin olun \' ifadesi – redolent

+1

"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