Grep'de “* .pl” ve * .pl arasındaki fark nedir? Alıntı yapmak sonucu neden değiştirir?


10

Arasındaki fark nedir:
grep "string" . -r --include *.pl

ve

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

İkincisi alt dizinli dosyaları içerirken birincisi içermez. Neden?


Aradaki fark yok grep; kabukta. greptırnak işaretlerini asla görmez.
Wildcard

Yanıtlar:


17

*(Yıldız veya yıldız) o komutu verilmeden önce (genellikle) kabuk tarafından yorumlanır özel bir karakterdir. Önde gelen noktalara sahip olanlar dışında (genellikle) tüm dosya adlarına genişletilir. Daha fazla bilgi için kalıp eşleme ile ilgili bash kılavuzuna bakın .

Tırnak içine konulursa, yıldız kabuk tarafından yorumlanmaz ve kelimesi kelimesine verilir.


Örnekler açıklanmıştır. Alıntılanan:

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

Burada argüman ile grepseçenek alacaksınız . Bu karakter ilk karakter olarak 4 karakter dizesidir . Ne bu dize ile yaptığı tamamen yukarı etmektir . Bu durumda , yalnızca kalıpla eşleşen dosyaları dikkate almak anlamına gelir .--include*.pl*grepgrep--include*.pl

Sahne arkasındaki AFAIK gnu grep, gnu bash ile aynı desen eşleştirme lib'ini kullanır.

Alıntılanmamış olan:

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

Burada kabuk ilk önce kalıbı *.plbiten tüm dosya adlarına genişletecektir .pl. Dosyalar olduğunu varsayalım foo.pl, bar.plve baz.pl. Komut satırını genişlettikten sonra şöyle görünür:

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

İşte grepseçeneği alacak --includeargüman ile foo.plseçenekleri takip bar.plve baz.pl. --include foo.plyalnızca kalıpla eşleşen dosyaları dikkate almak anlamına gelir foo.pl. Desende joker karakterler bulunmadığından, eşleşen dosya ile eşleşen tek dosya foo.pl.

Seçenekler bar.plve baz.plaraçlar grep de bu dosyalarda arama yapar, ancak desenle eşleşmedikleri için yok foo.plsayılırlar.


Bu harika bir gözlem. Her zaman neden grep -rtutarsız göründüğünü merak ettim, ancak sadece bir kullandığımda fark etmedim *.
j883376

6

Fark, eğer desen ( *.pl) belirtmezseniz, kabuk tarafından genişletilir. Örneğin , kabuğunuzu genişlettiği için , grepadlı dosyayı içeren bir dizinde çalıştırırsanız , aslında gördükleriniz:foo.pl*plgrep

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

Yalnızca eklemeyi söylediğiniz için yalnızca foo.plbir dosyada arama yapar.

Eğer desen alıntı takdirde, kabuk olacak değil genişletmek ve grepyani doğru komutunu alır

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

peopltarafından genişletilmez *.pl.
unxnut

@ unxnut iyi bir nokta, cevap düzenlendi.
terdon
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.