2012-12-08 14 views
23

मेरे पास मेकफ़ाइल में निम्नलिखित है जो मेरे डेटाबेस को पुनर्निर्मित करने के उद्देश्य से आवश्यक है, यदि आवश्यक हो तो इसे नष्ट कर दें। यह काम नहीं करता।मेकफ़ाइल क्रियाओं में मैं शैल चर का उपयोग कैसे करूं?

.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 

क्यों यह गलत है? यह वैध बैश की तरह दिखता है जहां तक ​​मैं बता सकता हूं? क्या मेकफ़ाइल में ऐसा करने पर मुझे विशेष विचार करना चाहिए?

अद्यतन:

जवाब मैं एक काम संस्करण पर पहुंचे उपयोग करना:

.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 

उत्तर

38

कम से कम दो कारणों से कर रहे हैं। $() संदर्भ बनाओ चर। कमांड प्रतिस्थापन करने के लिए आपको $ से बचना होगा। साथ ही, खोल कमांड सभी एक पंक्ति पर होना चाहिए। प्रयास करें:

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 
+3

रहे हैं कुछ और बारीकियों एक पंक्ति "जो चर्चा करने योग्य हैं: (पारंपरिक रूप से और पोर्टेबल) जो कुछ भी आप ** उसी खोल ** द्वारा निष्पादित करना चाहते हैं ** एक तार्किक _make_ लाइन पर होना चाहिए। तो 'अस्तित्व = ... 'और' अगर ... फाई को अर्धविराम और बैकस्लाश के साथ एक कमांड लाइन में बनाया जाना चाहिए, लेकिन 'बनाया गया ...' खुशी से नुस्खा में एक अलग दूसरे कमांड के रूप में रह सकता है। –

+1

पाठक को: सुनिश्चित करें कि आपने अपने 'VAR =" foo "\' कथन – redolent

+1

के अंत में '\' रखा है, "सभी में एक पंक्ति" को https में वर्णित '.ONESHELL: 'का उपयोग करके आराम किया जा सकता है: //www.gnu.org/software/make/manual/html_node/One-Shell.html#One-Shell – sdive

संबंधित मुद्दे