GLOBIGNORE कैसे काम करता है?


15

बैश के मैनुअल पेज के अनुसार:

   GLOBIGNORE
          A colon-separated list of patterns defining the set of filenames
          to be ignored by pathname expansion.  If a filename matched by a
          pathname  expansion  pattern also matches one of the patterns in
          GLOBIGNORE, it is removed from the list of matches.

हालांकि व्यवहार में ...

$ bash --noprofile --norc
bash-4.2$ touch .bar
bash-4.2$ echo .*
. .. .bar
bash-4.2$ GLOBIGNORE=.
bash-4.2$ echo .*
.bar

..माचिस की सूची से क्यों निकाला जाता है? जहाँ तक मुझे पता है, पैटर्न .मेल नहीं खाता है .., है ना?

जवाबों:


14

नीचे स्क्रॉल करें ...

फ़ाइलनाम .और ..हमेशा GLOBIGNOREसेट नहीं होने पर अनदेखा कर दिए जाते हैं ।

अधिकांश समय, यह शामिल करने के लिए वांछनीय नहीं है .और ..वाइल्डकार्ड मैचों, क्योंकि वे निर्देशिका के अंदर फ़ाइलों का प्रतिनिधित्व नहीं करते के रूप में - वे निर्देशिका नेविगेशन काम करने वाले हैं हैक्स। वास्तव में, डॉट फ़ाइलों की उत्पत्ति कमांड के शुरुआती संस्करण में एक बग हैls । लेखक का मतलब सूची से बाहर करना था .और ..गलती से शुरू होने वाली सभी फाइलों को छोड़ दिया था .। इस प्रकार से डॉट फाइलें छिपी हो गईं ls। गोले की तरह फाइलों को छिपाकर गोले सूट करते हैं ls। हालांकि जिस तरह से यह किया गया था वह फिर से हैक था: .डॉट में पैटर्न स्पष्ट रूप से मेल नहीं खाता है, तो इसके साथ शुरू होने वाली फाइलें केवल बाहर रखी गई हैं। तो पैटर्न .*शामिल हैं .और ..

मौजूदा स्क्रिप्ट के साथ संगतता को बनाए रखने के लिए, आधुनिक गोले अभी भी शामिल हैं .और ..(zsh को छोड़कर, जो इस मुद्दे पर जैसे कई अन्य लोगों के पास एक संस्कार है, लेकिन पिछड़े संगत व्यवहार नहीं है)। हालाँकि, यदि आप सेट GLOBIGNOREकरते हैं , तो आप एक बैश-विशिष्ट सुविधा का उपयोग कर रहे हैं, जो दर्शाता है कि आप पिछड़ी संगतता में रुचि नहीं रखते हैं। इसलिए पैटर्न से मेल खाने के लिए .और ..सभी पैटर्न के मेल से परिवर्तन होता है ।

GLOBIGNORE=.किसी फ़ाइल को सेट करना किसी भी तरह GLOBIGNOREसे स्वचालित रूप से बाहर रखा जाता है जब भी सेट किया जाता है, इसलिए यह shopt -s dotglobसिवाय इसके समतुल्य है .और ..इसके बाद सभी पैटर्न से बाहर रखा गया है।


1
वास्तव में, मुझे केवल सेटिंग को GLOBIGNOREअनदेखा करने .और ..स्लेश-कम पैटर्न और GLOBIGNORE फ़िल्टर फ़ाइल पथ में फ़ाइल नाम नहीं होने का एहसास हुआ । GLOBIGNORE=.; echo .*शामिल नहीं होगा .और न ही .., लेकिन GLOBIGNORE=.; echo ./.*(या echo /bin/.*) होगा! अनदेखी करने के लिए .और ..सभी globs से, ऐसा लगता है आप की जरूरत लग रहा है shopt -s extglobऔर GLOBIGNORE='?(*/)@(.|..)'
स्टीफन चेजलस

1
वास्तव में, नहीं, GLOBIGNORE='?(*/)@(.|..)'बाहर करने .और ..में विफल होगा .*/fooGLOBIGNORE='?(*/)@(.|..)?(/*)'./*
ग्लब्स

3

"Pathname विस्तार" शीर्षक अनुभाग से man bash:

फ़ाइल नाम ''। '' और '' .. '' को हमेशा नजरअंदाज किया जाता है जब GLOBIGNORE सेट किया जाता है और अशक्त नहीं होता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.