2009-11-02 15 views
19

मैं शुरू-स्टॉप-डेमॉन का उपयोग कर एक init स्क्रिप्ट बनाने के लिए कोशिश कर रहे हैं। मैं डेमॉन के तर्कों पर फंस गया हूँ। मैं इन्हें स्क्रिप्ट के शीर्ष पर एक चर में रखना चाहता हूं लेकिन मुझे उद्धरणों को सही तरीके से फ़िल्टर करने के लिए नहीं मिल सकता है।शुरू-स्टॉप-डेमॉन उद्धृत तर्क गलत व्याख्या

मैं यहाँ ls इस्तेमाल करेंगे तो हम बाइनरी और तर्क है कि ज्यादातर लोग अभ्यस्त पता है या के बारे में परवाह को देखने के लिए नहीं है।

अंतिम परिणाम मैं देख रहा हूँ शुरू रोक ... विकल्प से बचने और कोटेशन के असंख्य रूपों की कोशिश कर ला ls चलाने के लिए

DAEMON=/usr/bin/ls 
DAEMON_OPTS='-la "/folder with space/"' 

start-stop-daemon --start --make-pidfile --pidfile $PID --exec $DAEMON -- $DAEMON_OPTS 

डबल "अंतरिक्ष/साथ/फ़ोल्डर" के लिए है मदद मत करो ... फिर वे डेमॉन पर खत्म हो जाते हैं, वे हमेशा गड़बड़ हो जाते हैं। उद्धरण में संलग्न $ DAEMON_OPTS बातें परिवर्तन ... तो वे बोली के बाद से एक है ... कभी नहीं सही संख्या हालांकि :)

कमांड लाइन गूंज (स्टार्ट-रोक ...) प्रिंट बिल्कुल के रूप में देखा जाता है स्क्रीन पर सही सामान। लेकिन डिमन (वास्तविक, एलएस नहीं) तर्कों की गलत संख्या के बारे में शिकायत करता है।

मैं कैसे एक चर इतना है कि यह अंदर उद्धरण डेमॉन को सही ढंग से करने के लिए अपने साथ लाया जाता है निर्दिष्ट करूँ?

+0

स्पष्ट करने के लिए। मैंने सामान्य उद्धरण भिन्नताओं की बहुत कोशिश की है। डबल कोट्स के अंदर एकल, "-ला"/फ़ोल्डर ... सिंगल कोट्स, '-ला "/ फ़ोल्डर के अंदर डबल ... उद्धरण उद्धृत," -ला \ "/ फ़ोल्डर ... \" " केवल इसके बजाय प्रत्येक स्थान के लिए बैकस्लैश, फ़ोल्डर \ 0 ... मैं कल्पना करता हूं कि समस्या किसी भी तरह स्टार्ट-स्टॉप-डिमन और इसकी व्याख्याओं के साथ है ... लेकिन यह वैरिएबल को बदलने के बाद से बहुत अधिक समझ में नहीं आता है कमांड लाइन कामकाजी परिणाम पैदा करता है। –

उत्तर

7

मैं मैं अंतिम मेरे कार्य init स्क्रिप्ट में प्रयोग किया कोटेशन पोस्ट था सोचा:

COMMAND="/path/to/script -opt param param2 param3" 
DAEMON_OPTS=" 0.0.0.0:$PORT -dest $OUTPUT_DIRECTORY -command" 

start-stop-daemon --start --background --make-pidfile --pidfile $PID --exec $DAEMON -- $DAEMON_OPTS "\"$COMMAND\"" 

जाहिर है एक अधूरी और गैर कार्यात्मक उदाहरण लेकिन मुझे आशा है कि आप इसे का सार मिलता है। आंतरिक जोड़ी के साथ दोहरे उद्धरण बच निकले हैं कि चाल क्या है।

+0

यह काम कर सकते हैं, लेकिन यह है कि आप init स्क्रिप्ट ही है, जो एक बड़ा नुकसान है संशोधित की आवश्यकता है। जब आप पैकेज को अपग्रेड करते हैं तो मैं/etc/default/में जो कुछ भी वैरिएबल सेट करने में सक्षम होना चाहता हूं और फिर उन्हें इनिट स्क्रिप्ट में बनाए रखना नहीं चाहता। – deltaray

+0

मुझे लगता है कि आपको हमेशा आधे उदाहरणों के बजाय पूर्ण उदाहरण शामिल करना चाहिए। –

13

प्रयास करें

DAEMON_OPTS="-la '/folder with space/'" 
start-stop-daemon --start ... -- $DAEMON_OPTS 

क्या होता है कि DAEMON_OPTS के बाहरी उद्धरण हटा दिए जाते हैं लेकिन भीतरी (एकल उद्धरण) रहते हैं। तो अगली पंक्ति पढ़ा जाएगा:

start-stop-daemon --start ... -- -la '/folder with space/' 

जो है तुम क्या चाहते।

बचने के साथ ही प्रभाव प्राप्त करना भी संभव है, लेकिन इसके लिए आपको बहुत से भागने की आवश्यकता है: सबसे पहले, असाइनमेंट के दौरान उद्धरणों की रक्षा के लिए, फिर बाद में जब प्रारंभ रेखा को पार्स किया जाता है और चर का विस्तार किया जाता है और यहां तक ​​कि एक बार कम या ज्यादा। :) bash -x कि जैसी चीजों के लिए अपने दोस्त है।

[संपादित करें] कोड ऊपर कुछ भी लिनक्स लेकिन पर बॉर्न और कॉर्न खोल के साथ काम करता है। लिनक्स पर, ksh या bash साथ, खोल अतिरिक्त उद्धरण जोड़ देगा जो गंदगी पूरी बात:

FOLDER="/folder with space/" 
DAEMON_OPTS="-la $FOLDER" 
start-stop-daemon --start ... -- $DAEMON_OPTS 

आप -x के साथ चलाते हैं, तो आप देखेंगे:

FOLDER='/folder with space/' 
DAEMON_OPTS='-la ~/folder with space/' 
ls -la '~/folder' with space/ 

तो केवल पहला शब्द सुरक्षा प्राप्त करता है (शायद क्योंकि इसमें एक विशेष चरित्र होता है)। मैं $FOLDER आसपास एकल उद्धरण जोड़ दें, तो मैं मिलता है:

FOLDER='/folder with space/' 
DAEMON_OPTS='-la '\''~/folder with space/'\''' 
ls -la ''\''~/folder' with 'space/'\''' 

शाबाश। युक्ति:,

start-stop-daemon --start ... -- $DAEMON_OPTS "$DAEMON_PATH" 

[EDIT2] यह काम करता है भी: विकल्पों के साथ एक और पथ के साथ अन्य: दो चर में विकल्पों को विभाजित

FOLDER="$HOME/folder with space/" 
opt[0]=-la 
opt[1]=$FOLDER 
ls "${opt[@]}" 

अर्थात एक सरणी में शब्द डाल दिया।

+0

शायद मैं कुछ गलत कर रही है, लेकिन इस समाधान काम नहीं करता है जब मैं यह कोशिश? –

+0

हां, पार्टी के साथ काम नहीं करता है:/मैं "$ आर्ग '$ ऑप्ट'" यह सफलतापूर्वक तर्क पर एक पाश का उपयोग करने और 'आर्ग का उपयोग करके सबस्क्रिप्ट तर्क पारित करने के लिए उपयोग किया है =' और उसके बाद '$ cmd $ का उपयोग कर तर्क '(कोई उद्धरण नहीं)। बोर्न और कॉर्न शैल के साथ काम करता है। –

+0

जब तक आप लिनक्स पर ksh का उपयोग कर रहे (ksh-93S-59.7 के साथ परीक्षण किया)। संक्षिप्त उत्तर में –

0

क्या आपने उद्धरणों के साथ इसे अन्य तरीकों से करने का प्रयास किया है? इस तरह:

 
DAEMON_OPTS='-la "/folder with space/"' 

मुझे यकीन नहीं है, लेकिन यह काम कर सकता है?

(अगर मैंने ऐसा करने के लिए पर्याप्त प्रतिष्ठा प्राप्त की थी, तो मैंने इसे पिछले उत्तर में टिप्पणी के रूप में पोस्ट किया होगा)।

+0

मैंने कोशिश की और किसी अन्य उद्धरण संयोजन की मुझे पता है ... भाग्य नहीं। –

0

जब भी आपके पास रिक्त स्थान के साथ बैश वैरिएबल होता है, तो सुनिश्चित करें कि आप इसका जिक्र करते समय उद्धरण का उपयोग करें।

शुरू रोकने के डेमॉन --start --make-pidfile --pidfile $ पीआईडी ​​--exec $ डेमॉन - "$ DAEMON_OPTS"

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