2009-04-30 12 views
6

मैंzsh में {1..9} का उपयोग करके मुझे यह त्रुटि क्यों मिलती है?

zgrep -c compinit /usr/share/man/man{1..9}/zsh* 

मैं

zsh: no matches found: /usr/share/man/man2/zsh* 

यह अजीब बात है, निम्नलिखित कोड चलाने निम्नलिखित काम करता है

echo Masi{1..9}/masi 

यह मैं पता चलता है कि समस्या Zsh में एक बग हो सकता है के बाद से ।

क्या ऊपर [1..9} के लिए ज़ेड में एक बग है?

उत्तर

8

यह कोई बग नहीं है, और यह शब्दों के ठीक अंदर काम कर रहा है। आप यहां जो परेशानी कर रहे हैं वह यह है कि {1..9} कोई वाइल्डकार्ड अभिव्यक्ति नहीं है जैसे * है; जैसा कि आपका गूंज उदाहरण दिखाता है, यह एक पुनरावृत्ति विस्तार है। तो आपका zgrep उदाहरण बिल्कुल वैसा ही है जैसा आपने प्रत्येक वैकल्पिक संस्करण को कमांड लाइन में टाइप किया था, और उसके बाद मैन 2 में zsh से शुरू होने वाले कोई भी मैन पेज नहीं हैं, यह त्रुटियों से बाहर है।

(यह एक मैच, नहीं कुछ भी आंतरिक रूप से अपने ब्रेस अनुक्रम विस्तार से संबंधित खोजने के लिए एक विफलता पर बाहर erroring है।) आप इस किया था, तो दूसरी ओर:

zgrep -c compinit /usr/share/man/man[1-9]/zsh* 

परिणाम आपको मिल चाहते हैं आप उम्मीद करते हैं, क्योंकि [1-9] एक सामान्य वाइल्डकार्ड अभिव्यक्ति है।

+0

तो हम दो रिक्त स्थान हैं: एक गैर वाइल्डकार्ड है और दूसरा वाइल्डकार्ड स्पेस है। यदि एक वाइल्डकार्ड मौजूद है, तो यह मुझे केवल वाइल्डकार्ड वर्णों का उपयोग करने के लिए मजबूर करता है। इसी तरह, आप केवल गैर-वाइल्डकार्ड वर्णों का उपयोग अकेले ही कर सकते हैं। - - आपके उत्तर के लिए धन्यवाद! –

+2

@ मासी: बिल्कुल नहीं। अगर मेरे पास 1-हैलो.gif, 2-world.gif, ..., 20-foobar.gif, '{1..20} - *। Gif' से निर्देशिका करने के लिए पूरी तरह से ठीक काम करेगा, जबकि' [1-20] - *। Gif' केवल पहले दो से मेल खाएगा। यह आपके प्रश्न में एक ही त्रुटि का कारण बन जाएगा यदि अनुक्रमिक रूप से क्रमांकित फ़ाइलों में से कोई भी गायब है, हालांकि। – ephemient

+0

@ephemient: क्या आपका मतलब है कि [1-20] फ़ाइल नहीं है यदि आपके पास नहीं है, उदाहरण के लिए, 7File? - यदि हां, तो {1..20} के बजाय [1-20] का उपयोग करने का क्या फायदा है जो आपको समस्या का कारण नहीं बनाता है? –

6

zsh में, यदि आप फ़ाइल नामों में श्रेणियों का उपयोग करना चाहते हैं, तो zle <1-n> किसी भी वास्तविक नाम पर विस्तार कर सकता है। यही कारण है कि कहने के लिए है:

$ touch a0b a1b a5b a7b 
$ print a<0-100>b 

और फिर <Tab> मारा सही अंतिम b के बाद print a0b a1b a5b a7b लाइन पर विस्तार के साथ छोड़ जाएगा। शायद पूरी श्रृंखला आवश्यकताओं, गैर फ़ाइल और पटकथा उपयोग - -

अन्य सभी इरादों और मकसदों के लिए

मैं रूप में नहीं बल्कि संक्षिप्त मुहावरेदार zsh पाश का उपयोग कर इस व्यक्त चाहते हैं:

for n ({1..50}); do print $n; done 

आप पूरी प्रक्रिया के लिए अनुमति देते विल इस तरह के एक फ़ाइल संग्रह है कि अभी तक अस्तित्व में नहीं है के रूप में 1 से 50 नंबर :) जिसके बाद आप के साथ उपयोगी चीजें के सभी प्रकार के कर सकते हैं, के अनुक्रम रेंज:

arr=($(for n ({1..50}); do print /my/path/file$n.txt; done)) && print $arr[33] 
संबंधित मुद्दे