क्या करता है `[।] फू। यह `..` से मेल क्यों खाता है?


16

निम्नलिखित को देखें:

$ echo .[].aliases[]
..
$ echo .[].foo[]
..
$ echo .[].[]
..
$ echo .[].xyz[]
..
$ echo .xyz[].xyz[]
.xyz[].xyz[]
$ echo .xyz[].[]
.xyz[].[]

जाहिरा तौर पर यह कुछ गड़बड़ लग रहा है, लेकिन मुझे समझ नहीं आता कि परिणाम एक साथ कैसे आता है। मेरी समझ []से एक खाली चरित्र वर्ग है। अगर यह सहज होगा

  • यह केवल खाली स्ट्रिंग से मेल खाता है; इस मामले में, मैं अपेक्षा करता हूं कि इस निर्देशिका में कुछ भी नहीं होने के कारण यह पूरी तरह से फिर से शुरू हो जाएगा, लेकिन यह भी चीजों से मेल खाता है ..aliases( जैसे पहले उदाहरण में),
  • या कुछ भी नहीं; इस मामले में, मैं कुल में भी स्ट्रिंग को पुन: पेश करने के लिए बैश की उम्मीद करूंगा।

यह GNU बैश, संस्करण 4.4.23 (1) -release के साथ है।

जवाबों:


25

[एक सेट शुरू होता है। एक सेट द्वारा समाप्त किया जाता है ]। लेकिन ]सेट के हिस्से के रूप में एक तरीका है , और वह ]पहला चरित्र निर्दिष्ट करना है । जैसा कि एक खाली सेट का कोई मतलब नहीं है, यह अस्पष्ट नहीं है।

तो आपके उदाहरण मूल रूप से एक बिंदु के बाद सभी बिंदु हैं, जिसमें एक बिंदु शामिल है, इसलिए यह दो बिंदुओं से मेल खाता है।

बाद के उदाहरणों में कोई फाइल नहीं मिलती है और इसलिए उन्हें शब्दशः लौटा दिया जाता है।


4

केवल उद्धृत तार ग्लोबिंग के अधीन नहीं हैं :

$ echo ".[].aliases[]"
.[].aliases[]

लेकिन गैर-उद्धृत तार ग्लोबिंग के अधीन हैं। एक अनुत्तरित स्ट्रिंग जिसमें *एक ?या (वैध) [](ब्रैकेट अभिव्यक्ति) होती है, जो इसे मेल खाने वाली फ़ाइलों की सूची द्वारा संशोधित की जाएगी। उसी तरह जैसे एक *मिलान निर्देशिका में सभी फाइलों में बदल जाएगा और ?केवल एक चरित्र की फाइलों से मेल खाएगा, (एक वैध) []कोष्ठक के अंदर पात्रों के साथ फाइलों का मिलान करेगा। एक डॉट एक मान्य चरित्र है:

$ echo a[.]b
a[.]b

$ touch "a.b"
$ echo a[.]b
a.b

]यह मैच करने में सक्षम होने के लिए कोष्ठक के अंदर पहला वर्ण होना चाहिए:

$ touch "a]b"
$ ls a[]]b
a]b

एक खाली ब्रैकेट अभिव्यक्ति कोई मतलब नहीं है (और विस्तारित नहीं है):

$ touch ab
$ ls a[]b
ls: cannot access 'a[]b': No such file or directory

यही कारण है कि यह काम करता है:

$ touch a]c abc afc azc a:c a?c aoc 
$ ls a[]bfz:?]c
abc  a:c  a?c  a]c  afc  azc

के लिए [विचार समान है:

$ touch a[c
$ ls a[[]c
a[c

लेकिन यह ब्रैकेट अभिव्यक्ति में किसी भी स्थिति में हो सकता है:

$ ls a[]bf[z:?]c
abc  a:c  a?c  a[c  a]c  afc  azc

$ ls a[]bfz:?[]c
abc  a:c  a?c  a[c  a]c  afc  azc

आपके द्वारा पोस्ट की जाने वाली स्ट्रिंग .[].foo[]एक डॉट के बाद एक ], एक ., एक f, oया एक से मेल खाएगी [। यह समान है:

$ echo a[].foo[]c
a[c a]c afc aoc

और यह निम्नानुसार मेल करेगा:

$ touch .] .f .o .[ .a .b .z

$ echo .[].foo[]
.. .[ .] .f .o

ध्यान दें कि निर्देशिका प्रविष्टि ..को बनाने की आवश्यकता नहीं है क्योंकि यह डिफ़ॉल्ट रूप से प्रत्येक निर्देशिका के अंदर मौजूद है। लेकिन एक साधारण बिंदी .एक ग्लोब से मेल नहीं खाएगी क्योंकि इसे स्पष्ट रूप से (वास्तव में एक डॉट का उपयोग करके) मिलान करना होगा।

लेकिन वह ..aliasesब्रैकेट अभिव्यक्ति के रूप में मेल नहीं खाएगा केवल एक चरित्र से मेल खाएगा । कई पात्रों से मेल खाने के लिए आपको *(कुछ भी) उपयोग करने की आवश्यकता है :

$ touch ..a ..l ..i ..aliases ..alias ..ali
$ echo .[].aliases[]
.. .[ .] .a

$ echo .[].aliases[]*
.. .[ .] .a ..a ..ali ..alias ..aliases ..i ..l
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.