Jawaban:
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 grep
akan menerima opsi --include
dengan argumen *.pl
. Itu adalah string 4 karakter dengan *
karakter sebagai karakter pertama. Apa yang grep
dilakukan dengan string itu sepenuhnya terserah grep
. Dalam hal ini --include
berarti 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 *.pl
ke semua nama file yang diakhiri .pl
. Misalkan ada file foo.pl
, bar.pl
dan baz.pl
. Setelah memperluas baris perintah terlihat seperti ini:
grep "string" . -r --include foo.pl bar.pl baz.pl
Di sini grep
akan menerima opsi --include
dengan argumen foo.pl
, diikuti oleh opsi bar.pl
dan baz.pl
. --include foo.pl
artinya 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.pl
dan baz.pl
sarana grep juga akan mencari dalam file-file itu, tetapi karena mereka tidak cocok dengan pola foo.pl
mereka akan diabaikan.
grep -r
tampak tidak konsisten tetapi tidak pernah memperhatikan hanya ketika saya menggunakan *
.
Perbedaannya adalah bahwa jika Anda tidak mengutip polanya ( *.pl
) itu diperluas oleh shell. Misalnya, jika Anda menjalankan grep
dalam direktori yang berisi file bernama foo.pl
, karena *pl
diperluas oleh shell, yang grep
sebenarnya dilihat adalah:
grep "string" . -r --include foo.pl
Karena Anda menyuruhnya hanya menyertakannya, foo.pl
itu hanya akan mencari melalui satu file itu.
Jika Anda mengutip pola Anda, shell tidak akan mengembangkannya dan grep
mendapatkan perintah yang benar, yaitu
grep "string" . -r --include *pl
peopl
tidak akan diperluas oleh *.pl
.
grep
; ada di shell.grep
tidak pernah melihat tanda kutip.