मैं तर्क के रूप में "-" के साथ शुरू होने वाली फाइलों से बैश विस्तार को कैसे रोक सकता हूं?


14

मैं एक स्ट्रिंग को फिर से खोजने की कोशिश कर रहा हूँ, grepलेकिन मुझे यह मिल गया है:

$ grep -r "stuff" *
grep: unrecognized option '---corporate-discount.csv'
Usage: grep [OPTION]... PATTERN [FILE]...
Try 'grep --help' for more information.

मैं -तर्क के रूप में शुरू होने वाली फाइलों को पास होने से कैसे रोक सकता हूं ?



3
आप वास्तव में शेल को इन फ़ाइलों को पारित करने से रोकना नहीं चाहते हैं, क्या आप? सवाल यह है कि कैसे बताया जाए grepकि वे विकल्प नहीं हैं।
डॉनहोल्गो

11
... स्पष्ट होने के लिए, बैश नियंत्रित नहीं करता है कि कौन से परिणाम विकल्प के रूप में व्यवहार किए जाते हैं बनाम तर्क के रूप में माना जाता है; यह कार्यक्रम के नियंत्रण में है। आप subprocess.Popen(['grep', '-r', '-e' 'stuff', '--corporate-discount.csv'])पायथन में , के साथ एक ही व्यवहार मिल जाएगा, कहीं भी कोई मार।
चार्ल्स डफी

1
संबंधित रीडिंग: यूनिक्स वाइल्डकार्ड्स गॉर्ड वाइल्ड , सुरक्षा मुद्दों के बारे *में जो कमांडों में उपयोग करने के कारण हो सकते हैं । इन सभी का उपयोग ./*करने के बजाय से बचा जा सकता है ।
वाइल्डकार्ड

1
@ एंडकार्ड, --एंड-ऑफ-ऑप्शन के रूप में उपयोग करते हुए सर्जन पूरी तरह से उचित है; POSIX उपयोगिता वाक्यविन्यास दिशानिर्देशों को सम्मानित करने की आवश्यकता है; # 10 दिशानिर्देश देखें। (निश्चित रूप से, सभी कार्यक्रम POSIX दिशानिर्देशों का पालन नहीं करते हैं, लेकिन इसका उत्तर आक्रामक कार्यक्रमों के लेखकों को तैयार करना है और / या उन्हें उद्योग से बाहर निकाल देना है)।
चार्ल्स डफी

जवाबों:


43

सबसे पहले, ध्यान दें कि डैश के साथ शुरू होने वाले तर्कों की व्याख्या कार्यक्रम शुरू होने तक है, grep या अन्य पर । शेल के पास इसे नियंत्रित करने का कोई सीधा तरीका नहीं है।

मान लें कि आप ऐसी फ़ाइलों को संसाधित करना चाहते हैं (और उन्हें पूरी तरह से अनदेखा न करें), grepअधिकांश कार्यक्रमों के साथ, --विकल्पों के अंत को इंगित करने के रूप में पहचानता है , इसलिए

grep -r -e "stuff" -- *

जो चाहोगे, करोगे। -eमामले में वहाँ है stuffएक साथ शुरू होता है- और साथ ही।

वैकल्पिक रूप से, आप भी उपयोग कर सकते हैं:

grep -r -e "stuff"  ./*

उत्तरार्द्ध एक समस्या से बचना होगा यदि -वर्तमान निर्देशिका में एक फ़ाइल थी । --विभाजक के बाद भी , अर्थ स्टड के रूप में grepव्याख्या -करता है, जबकि वर्तमान निर्देशिका में ./-फ़ाइल को कहा जाता -है।


8

"-" के साथ शुरू होने वाली फ़ाइलों को पास करने से बैश के विस्तार को रोकने के लिए आप इसका उपयोग कर सकते हैं:

echo [!-]*

जो अधिकांश गोले में, या ksh, bash, zsh के लिए विशिष्ट रूप से काम करता है:

echo !(-*)

उदाहरण के लिए: इस फ़ाइलों के साथ एक निर्देशिका में

$ echo *
a b c ---corporate-discount.csv d -e --option.txt

केवल सूची देगा ( extglobसक्रिय है)

$ shopt -s extglob
$ echo !(-*)
a b c d

$ echo [!-]*
a b c d

लेकिन अगर आप चाहते हैं कि एक -विकल्प के रूप में बताई गई फ़ाइलों की व्याख्या करने से बचने के लिए grep को बताते हुए सभी फ़ाइलों को संसाधित करना है , तो बस एक जोड़ें ./:

grep -r "stuff" ./*

या, वहाँ है अगर गारंटी नहीं है कि वास्तव में कहा जाता है कोई फाइल -सूचीबद्ध फ़ाइलों में मौजूद है (ग्रेप एक अकेला व्याख्या करेगा -के रूप में stdin से पढ़ा ), तो आप उपयोग कर सकते हैं:

grep -r -- "stuff" *

हां, जैसा कि सवाल बीएश, एक जीएनयू शेल के बारे में है, यह मानना ​​उचित है कि एक जीएनयू ग्रिप उपलब्ध है, स्थापित किया जा सकता है, या वास्तव में उपयोग किया जा रहा है। @ स्टेफेनचैलेजेलस
आइजैक

हां, एक grep -r -- stuff *सरल है, और गैर-ग्निश ग्रीप्स के साथ भी काम करता है। इसलिए: जोड़ा, धन्यवाद। @ स्टीफनचेज़ेलैस
आइजैक

@ यदि मैं नहीं कहूंगा कि यह एक उचित धारणा है "यदि बैश उपलब्ध है, तो GNU ग्रिप भी उपलब्ध है"। उदाहरण के लिए ले लीजिए FreeBSD: bash डिफ़ॉल्ट रूप से इंस्टॉल नहीं होता है , जिसे बाद में इंस्टॉल किया जा सकता है, लेकिन grep पर इसका कोई प्रभाव नहीं है - यह grep का BSD संस्करण है जब तक कि GNU grep स्पष्ट रूप से स्थापित नहीं होता है। लेकिन यह एक छोटी सी नाइटपिक है। मैं extglob के माध्यम से वैकल्पिक दृष्टिकोण की तरह है, इसलिए + जवाब 1'ed
सर्गी Kolodyazhnyy

2
@SergiyKolodyazhnyy, AFAIK, grepFreeBSD पर अभी भी जीएनयू पर आधारित है grepऔर अभी भी उस मिसफिट को जिसमें गैर-विकल्पों के बाद मान्यता प्राप्त है। यहां तक ​​कि बीएसबीडी जैसे ओबीएसबीएसडी grepने अपने फिर से लिखे गए जीएनयू को पिछड़े पोर्टेबिलिटी के लिए संगत बना दिया है (और अभी भी यहाँ उस व्यवहार को दिखाते हैं)। MacOS पर, शश बैश है, लेकिन मुझे उम्मीद है कि उनके grep उस व्यवहार को नहीं दिखाएंगे क्योंकि macOS का मतलब $ POSIXLY_CORRECT के बिना भी POSIX का अनुपालन है। किसी भी मामले में, ओपी के ग्रेप है जीएनयू-संगत के बाद से यह है कि त्रुटि देता है।
स्टीफन चेज़लस

1
echo [!-]*Ksh's (या bash -O extglob's) के मानक समकक्ष के रूप में भी देखें echo !(-*)
स्टीफन चेज़लस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.