Grep में "* .pl" और * .pl में क्या अंतर है? क्यों उद्धृत करने से परिणाम बदल जाता है?


10

के बीच क्या अंतर है:
grep "string" . -r --include *.pl

तथा

grep "string" . -r --include "*.pl"

उत्तरार्द्ध में उपनिर्धारित में फाइलें शामिल हैं जबकि पूर्व नहीं। क्यों?


अंतर नहीं है grep; यह खोल में है। grepउद्धरण कभी नहीं देखता।
वाइल्डकार्ड

जवाबों:


17

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

यदि उद्धरणों में रखा गया है तो स्टार को शेल द्वारा व्याख्या नहीं की जाएगी और कमांड वर्बेटिम को दिया जाता है।


उदाहरण समझाया। एक उद्धृत:

grep "string" . -r --include "*.pl"

यहां तर्क के साथ grepविकल्प प्राप्त होगा । यह चरित्र के साथ पहले चरित्र के रूप में 4 वर्ण स्ट्रिंग है । उस स्ट्रिंग के साथ क्या करना पूरी तरह से है । इस मामले में केवल पैटर्न से मेल खाने वाली फ़ाइलों पर विचार करने का मतलब है ।--include*.pl*grepgrep--include*.pl

AFAIK परदे के पीछे gnu grep उसी पैटर्न का उपयोग करता है जो gnu bash के रूप में मिलान करता है।

एक उद्धृत नहीं:

grep "string" . -r --include *.pl

यहां शेल पहले *.plसमाप्त होने वाले सभी फ़ाइल नाम के पैटर्न का विस्तार करेगा .pl। मान लीजिए कि फाइलें हैं foo.pl, bar.plऔर baz.pl। कमांड लाइन के विस्तार के बाद ऐसा दिखता है:

grep "string" . -r --include foo.pl bar.pl baz.pl

यहां तर्क के साथ grepविकल्प मिलेगा , इसके बाद विकल्प और । केवल पैटर्न से मेल खाने वाली फ़ाइलों पर विचार करने का मतलब है । चूंकि पैटर्न में कोई वाइल्डकार्ड नहीं हैं, इसलिए केवल फ़ाइल मिलान जिसे फ़ाइल नाम दिया जाएगा ।--includefoo.plbar.plbaz.pl--include foo.plfoo.plfoo.pl

विकल्प bar.plऔर baz.plसाधन grep उन फ़ाइलों में भी खोज करेंगे, लेकिन चूंकि वे पैटर्न से मेल नहीं खाते हैं, foo.plइसलिए उन्हें अनदेखा किया जाएगा।


यह एक महान अवलोकन है। मैं हमेशा सोचता grep -rथा कि क्यों असंगत लग रहा था, लेकिन कभी भी इस पर ध्यान नहीं दिया गया था कि जब मैं एक का उपयोग करता था *
j883376

6

अंतर यह है कि यदि आप पैटर्न का उद्धरण नहीं करते हैं ( *.pl) यह शेल द्वारा विस्तारित है। उदाहरण के लिए, यदि आप grepएक निर्देशिका में अपना नाम चलाते हैं, जिसमें एक फ़ाइल होती है foo.pl, जिसे *plशेल द्वारा विस्तारित किया जाता है, जो grepवास्तव में देखता है:

grep "string" . -r --include foo.pl

चूंकि आप इसे केवल शामिल करने के लिए कहते हैं, foo.plयह केवल उस एक फ़ाइल के माध्यम से खोज करेगा।

यदि आप अपने पैटर्न को उद्धृत करते हैं, तो शेल इसका विस्तार नहीं करेगा और grepसही कमांड प्राप्त करता है, अर्थात्

 grep "string" . -r --include *pl

peoplद्वारा विस्तार नहीं मिलेगा *.pl
21

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