2011-09-08 21 views
6

मैं इस तरह एक कार्यक्रम चलाने के लिए कोशिश कर रहा हूँ करने के लिए लागू पैरामीटर के रूप में कई तर्क का मूल्यांकन करने के बैश/zsh मजबूर करने के लिए:कैसे जब एक आदेश

$CMD $ARGS 

जहां $ ARGS रिक्त स्थान के साथ बहस का एक सेट है। हालांकि, zsh निष्पादन योग्य को एक तर्क के रूप में $ ARGS की सामग्री को सौंपना प्रतीत होता है। यहां एक विशिष्ट उदाहरण दिया गया है:

$export ARGS="localhost -p22" 
$ssh $ARGS 
ssh: Could not resolve hostname localhost -p22: Name or service not known 

क्या इस व्यवहार को नियंत्रित करने वाला कोई बैश या zsh ध्वज है?

ध्यान दें कि जब मैं इस प्रकार के कमांड को $!/Bin/sh स्क्रिप्ट में डालता हूं, तो यह अपेक्षित प्रदर्शन करता है।

धन्यवाद,

SetJmp

+0

इसका मतलब यह नहीं है कि zsh POSIX-compliant नहीं है? – jpalecek

+0

@jpalecek यह स्पष्ट रूप से अनुरोध नहीं किया गया है (कुछ विकल्प सेट करके, इसे '**/sh' -> '/ bin/zsh' symlink का उपयोग करके या' अनुकरण sh' का उपयोग करके) (जो बदले में कुछ विकल्प सेट करता है))। – ZyX

उत्तर

4

अगर आप eval $CMD $ARGS का उपयोग यह काम करेंगे।

7

यदि आप एक स्ट्रिंग वेरिएबल (एरे भी हैं) को कमांड से पहले शब्दों में विभाजित करना चाहते हैं, तो $=VAR का उपयोग करें। वहाँ भी एक विकल्प (shwordsplit अगर मैं भूल नहीं कर रहा हूँ) है कि command $=VAR की तरह किसी भी command $VAR कार्य कर देगा है, लेकिन मैं इसे स्थापित करने के लिए नहीं सुझाव है: और command "${ARRAY[@]}" (zsh: मैं इसे बहुत असुविधाजनक command "$VAR" की तरह (command $VAR zsh) बातें लिखना: command $ARRAY)।

5

zsh में यह आसान है:

उपयोग cmd ${=ARGS} शब्द (सफेद स्थान पर विभाजित) द्वारा अलग तर्क में $ARGS विभाजित करने के लिए।

का उपयोग $ARGS को लाइन द्वारा अलग तर्कों में विभाजित करने के लिए करें (न्यूलाइन पर विभाजित करें लेकिन रिक्त स्थान/टैब नहीं)।

जैसा कि अन्य ने उल्लेख किया है, SH_WORD_SPLIT सेटिंग को डिफ़ॉल्ट रूप से शब्द विभाजन करना होता है, लेकिन इससे पहले कि आप इसे zsh, cf में करें। http://zsh.sourceforge.net/FAQ/zshfaq03.html एक स्पष्टीकरण के लिए कि क्यों व्हाइटस्पेस विभाजन डिफ़ॉल्ट रूप से सक्षम नहीं है।