2012-01-08 4 views
6

यह another issue के समान है, लेकिन मुझे केवल चाहिए यदि मैं विशिष्ट लक्ष्य चला रहा हूं और एक अनिवार्य चर निर्दिष्ट नहीं किया गया है।यदि अनिर्धारित है तो लक्ष्य-विशिष्ट मेकफ़ाइल चर के लिए कैसे संकेत दें?

वर्तमान कोड:

install-crontab: PASSWORD ?= "$(shell read -p "Password: "; echo "$$REPLY")" 
install-crontab: $(SCRIPT_PATH) 
    @echo "@midnight \"$(SCRIPT_PATH)\" [...] \"$(PASSWORD)\"" 

यह सिर्फ निम्नलिखित उत्पादन में परिणाम है और कोई शीघ्र:

Password: read: 1: arg count 
@midnight [...] "" 

यहां महत्वपूर्ण बात मैं केवल जब चल रहा है इस पूछने के लिए कि है लक्ष्य, और केवल यदि चर परिभाषित नहीं किया गया है। मैं configure स्क्रिप्ट का उपयोग नहीं कर सकता, क्योंकि स्पष्ट रूप से मुझे कॉन्फ़िगर स्क्रिप्ट में पासवर्ड स्टोर नहीं करना चाहिए, और क्योंकि यह लक्ष्य मानक स्थापना प्रक्रिया का हिस्सा नहीं है।

उत्तर

6

बाहर कर देता है समस्या यह थी कि Makefiles डैश/बैश शैली उद्धरण, और कि डैश के read में निर्मित एक चर नाम की जरूरत है, बैश के विपरीत प्रयोग नहीं करते। जिसके परिणामस्वरूप कोड:

install-crontab-delicious: $(DELICIOUS_TARGET_PATH) 
    @while [ -z "$$DELICIOUS_USER" ]; do \ 
     read -r -p "Delicious user name: " DELICIOUS_USER;\ 
    done && \ 
    while [ -z "$$DELICIOUS_PASSWORD" ]; do \ 
     read -r -p "Delicious password: " DELICIOUS_PASSWORD; \ 
    done && \ 
    while [ -z "$$DELICIOUS_PATH" ]; do \ 
     read -r -p "Delicious backup path: " DELICIOUS_PATH; \ 
    done && \ 
    (\ 
     CRONTAB_NOHEADER=Y crontab -l || true; \ 
     printf '%s' \ 
      '@midnight ' \ 
      '"$(DELICIOUS_TARGET_PATH)" ' \ 
      "\"$$DELICIOUS_USER\" " \ 
      "\"$$DELICIOUS_PASSWORD\" " \ 
      "\"$$DELICIOUS_PATH\""; \ 
     printf '\n') | crontab - 

परिणाम:

$ crontab -r; make install-crontab-delicious && crontab -l 
Delicious user name: a\b c\d 
Delicious password: e f g 
Delicious backup path: h\ i 
no crontab for <user> 
@midnight "/usr/local/bin/export_Delicious" "a\b c\d" "e f g" "h\ i" 
$ DELICIOUS_PASSWORD=foo make install-crontab-delicious && crontab -l 
Delicious user name: bar 
Delicious backup path: baz 
@midnight "/usr/local/bin/export_Delicious" "a\b c\d" "e f g" "h\ i" 
@midnight "/usr/local/bin/export_Delicious" "bar" "foo" "baz" 

इस कोड:

  • व्यवहार करता है शाब्दिक रूप में सभी इनपुट वर्ण, तो यह रिक्त स्थान और बैकस्लैश के साथ काम करता है,
  • अगर समस्याओं से बचा जाता है उपयोगकर्ता प्रेस कुछ भी लिखने के बिना दर्ज करें,
  • यदि वे मौजूद हैं, तो पर्यावरण चर का उपयोग करते हैं, और
  • काम करता है कि क्रोंटैब खाली है या नहीं।
2

l0b0 के उत्तर ने मुझे ऐसी ही समस्या के साथ मदद की जहां उपयोगकर्ता बाहर निकलना चाहता था अगर उपयोगकर्ता 'वाई' इनपुट नहीं करता है। मैंने यह कर लिया:

@while [ -z "$$CONTINUE" ]; do \ 
    read -r -p "Type anything but Y or y to exit. [y/N] " CONTINUE; \ 
done ; \ 
if [ ! $$CONTINUE == "y" ]; then \ 
if [ ! $$CONTINUE == "Y" ]; then \ 
    echo "Exiting." ; exit 1 ; \ 
fi \ 
fi 

मुझे उम्मीद है कि किसी की मदद करेगा। मेकफ़ाइल में if/else के लिए उपयोगकर्ता इनपुट का उपयोग करने के बारे में अधिक जानकारी प्राप्त करना मुश्किल है।

+0

जब तक मेरी आंखें मुझे धोखा देती हैं, कि जब आप केवल एंटर दबाते हैं तो लूप डिफ़ॉल्ट 'एन' का उपयोग करने के बजाए दोहराएगा। – l0b0

+0

आपको [सिंगल बराबर चिह्न '['] (http://mywiki.wooledge.org/Bashism#Conditionals) – l0b0

+2

का उपयोग करना चाहिए, आप' if' कथन को भी सरल बना सकते हैं: 'अगर [$$ CONTINUE! =" Y "] && [$$ जारी रखें! =" वाई "]; then'। या यहां तक ​​कि '[$$ CONTINUE =" y "] || [$$ CONTINUE = "वाई"] || ("बाहर निकलना" गूंजें; बाहर निकलें 1;) ' – l0b0