Apa perbedaan antara "* .pl" dan * .pl di grep? Mengapa mengutip mengubah hasil?

10

Apa perbedaan antara:
grep "string" . -r --include *.pl

dan

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

Yang terakhir termasuk file dalam subdirektori sedangkan yang pertama tidak. Mengapa?

Jim
sumber
Perbedaannya bukan di grep; ada di shell. greptidak pernah melihat tanda kutip.
Wildcard

Jawaban:

17

The *(bintang, atau tanda bintang) adalah karakter khusus yang (biasanya) ditafsirkan oleh shell sebelum diberikan perintah. Ini (biasanya) diperluas ke semua nama file kecuali yang memiliki titik terkemuka. Lihat manual bash tentang pencocokan pola untuk informasi lebih lanjut.

Jika ditempatkan dalam tanda kutip bintang tidak akan ditafsirkan oleh shell dan diberikan ke perintah kata demi kata.


Contoh dijelaskan. Yang dikutip:

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

Di sini grepakan menerima opsi --includedengan argumen *.pl. Itu adalah string 4 karakter dengan *karakter sebagai karakter pertama. Apa yang grepdilakukan dengan string itu sepenuhnya terserah grep. Dalam hal ini --includeberarti hanya mempertimbangkan file yang cocok dengan polanya *.pl.

AFAIK di belakang layar gnu grep menggunakan lib pencocokan pola yang sama dengan gnu bash.

Yang tidak dikutip:

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

Di sini shell pertama-tama akan memperluas pola *.plke semua nama file yang diakhiri .pl. Misalkan ada file foo.pl, bar.pldan baz.pl. Setelah memperluas baris perintah terlihat seperti ini:

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

Di sini grepakan menerima opsi --includedengan argumen foo.pl, diikuti oleh opsi bar.pldan baz.pl. --include foo.plartinya hanya mempertimbangkan file yang cocok dengan polanya foo.pl. Karena tidak ada wildcard dalam pola satu-satunya pencocokan file yang akan menjadi nama file foo.pl.

Opsi bar.pldan baz.plsarana grep juga akan mencari dalam file-file itu, tetapi karena mereka tidak cocok dengan pola foo.plmereka akan diabaikan.

lesmana
sumber
Ini pengamatan yang bagus. Saya selalu bertanya-tanya mengapa grep -rtampak tidak konsisten tetapi tidak pernah memperhatikan hanya ketika saya menggunakan *.
j883376
6

Perbedaannya adalah bahwa jika Anda tidak mengutip polanya ( *.pl) itu diperluas oleh shell. Misalnya, jika Anda menjalankan grepdalam direktori yang berisi file bernama foo.pl, karena *pldiperluas oleh shell, yang grepsebenarnya dilihat adalah:

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

Karena Anda menyuruhnya hanya menyertakannya, foo.plitu hanya akan mencari melalui satu file itu.

Jika Anda mengutip pola Anda, shell tidak akan mengembangkannya dan grepmendapatkan perintah yang benar, yaitu

 grep "string" . -r --include *pl
terdon
sumber
peopltidak akan diperluas oleh *.pl.
unxnut
@unxnut poin bagus, jawaban diedit.
terdon