2011-07-16 15 views
9

में जेएसएच में वैरिएबल विस्तार अलग है, जो मैं स्पष्ट करना चाहता हूं उसके लिए निम्नलिखित एक सरल परीक्षण केस है।बाश

बैश में,

# define the function f 
f() { ls $args; } 

# Runs the command `ls` 
f 

# Runs the fommand `ls -a` 
args="-a" 
f 

# Runs the command `ls -a -l` 
args="-a -l" 
f 

लेकिन zsh में

# define the function f 
f() { ls $args } 

# Runs the command `ls` 
f 

# Runs the fommand `ls -a` 
args="-a" 
f 

# I expect it to run `ls -a -l`, instead it gives me an error 
args="-a -l" 
f 

ऊपर पर zsh में अंतिम पंक्ति, मुझे निम्न त्रुटि देता है

ls: invalid option -- ' ' 
Try `ls --help' for more information. 

मुझे लगता है कि zsh निष्पादित हो रहा है

ls "-a -l" 

जो मुझे एक ही त्रुटि मिलती है।

तो, मैं यहां बैश के व्यवहार को कैसे प्राप्त करूं?

मुझे यकीन नहीं है कि मैं स्पष्ट हूं, अगर मुझे कुछ पता होना है तो मुझे बताएं।

+2

यह आपके सवाल का जवाब नहीं है, लेकिन मैं इस पर विचार बेहतर चाहते हैं: 'च() {ls" $ @ "; }; f -a -l' –

+0

@glenn, हाँ, निश्चित रूप से है। जैसा कि मैंने कहा, यह सिर्फ एक बड़ी समस्या का एक उदाहरण है, जहां मुझे तर्क चर का उपयोग करना है। –

+1

@ShrikantSharat यदि आप bash और zsh (और ksh) के लिए स्क्रिप्ट लिख रहे हैं, तो 'args' चर के साथ ऐसा न करें। इसके बजाय एक सरणी का प्रयोग करें। – Gilles

उत्तर

21

अंतर यह है कि (डिफ़ॉल्ट रूप से) zsh अनगिनत पैरामीटर विस्तार के लिए शब्द विभाजन नहीं करता है।

आप SH_WORD_SPLIT विकल्प सेट करके या एक व्यक्ति के विस्तार पर = ध्वज का उपयोग करके "सामान्य" शब्द बंटवारे सक्षम कर सकते हैं:

ls ${=args} 

या

setopt SH_WORD_SPLIT 
ls $args 

यदि आपका लक्ष्य गोले समर्थन सरणियों (ksh, bash, zsh), तो आप एक सरणी का उपयोग कर बेहतर हो सकते हैं:

args=(-a -l) 
ls "${args[@]}" 

zsh FAQ से:

  • 2.1: Differences from sh and ksh

    क्लासिक अंतर शब्द बंटवारे, सवाल 3.1 में चर्चा की है; यह बहुत से शुरू zsh उपयोगकर्ताओं को पकड़ता है।

  • 3.1: Why does $var where var="foo bar" not do what I expect? अक्सर पूछे जाने वाले प्रश्न इस प्रश्न को शामिल करते हैं।

zsh Manual से

: विशेष तथ्य यह है कि गैर उद्धृत मापदंडों के शब्द स्वचालित रूप से खाली स्थान के पर विभाजित नहीं कर रहे हैं जब तक विकल्प SH_WORD_SPLIT सेट किया गया है में

  • 14.3 Parameter Expansion

    नोट; अधिक जानकारी के लिए नीचे इस विकल्प के संदर्भ देखें। यह अन्य गोले से एक महत्वपूर्ण अंतर है।

  • SH_WORD_SPLIT

    कारण क्षेत्र बंटवारे गैर उद्धृत पैरामीटर विस्तार पर प्रदर्शन किया जाना है।

+0

हां, यही वही है जो मैं चाहता था। मुझे नहीं पता था कि Google या कहां देखना है, क्या आप कुछ दस्तावेज को इंगित कर सकते हैं जो इसे समझाते हैं? जवाब के लिए धन्यवाद। –

+0

इसके अलावा, '$ {= args}' उपयोग बैश के साथ संगत है? मेरे परीक्षणों की पुष्टि है कि यह है ... –

+3

* bash * (3.2.48, और 4.2.10) के मेरे सभी संस्करण '$ {= ...} को अस्वीकार करते हैं। मुझे यकीन है कि यह * zsh * के लिए विशिष्ट है। यदि आप * bash * और * zsh * को लक्षित कर रहे हैं, तो आप एक सरणी (मेरे अपडेट किए गए उत्तर में) आज़मा सकते हैं। –

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