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.
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
; ada di shell.grep
tidak pernah melihat tanda kutip.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:
Di sini
grep
akan menerima opsi--include
dengan argumen*.pl
. Itu adalah string 4 karakter dengan*
karakter sebagai karakter pertama. Apa yanggrep
dilakukan dengan string itu sepenuhnya terserahgrep
. 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:
Di sini shell pertama-tama akan memperluas pola
*.pl
ke semua nama file yang diakhiri.pl
. Misalkan ada filefoo.pl
,bar.pl
danbaz.pl
. Setelah memperluas baris perintah terlihat seperti ini:Di sini
grep
akan menerima opsi--include
dengan argumenfoo.pl
, diikuti oleh opsibar.pl
danbaz.pl
.--include foo.pl
artinya hanya mempertimbangkan file yang cocok dengan polanyafoo.pl
. Karena tidak ada wildcard dalam pola satu-satunya pencocokan file yang akan menjadi nama filefoo.pl
.Opsi
bar.pl
danbaz.pl
sarana grep juga akan mencari dalam file-file itu, tetapi karena mereka tidak cocok dengan polafoo.pl
mereka akan diabaikan.sumber
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 menjalankangrep
dalam direktori yang berisi file bernamafoo.pl
, karena*pl
diperluas oleh shell, yanggrep
sebenarnya dilihat adalah: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, yaitusumber
peopl
tidak akan diperluas oleh*.pl
.