Menggunakan {html,php,htm}
hanya bisa bekerja sebagai ekspansi penjepit , yang merupakan tidak standar fitur (tidak POSIX-compliant) dari bash
, ksh
, dan zsh
.
Agar perluasan tanda kurung kurawal dapat dikenali, itu harus berupa tanda kutip (bagian dari a) pada baris perintah.
Ekspansi brace meluas ke beberapa argumen , jadi dalam kasus yang dihadapi grep
akhirnya melihat beberapa --include=...
opsi, seperti jika Anda meneruskannya satu per satu.
Hasil ekspansi brace tunduk pada globbing (perluasan nama file) , yang memiliki kendala :
Setiap argumen yang dihasilkan selanjutnya dapat diperluas ke nama file yang cocok jika kebetulan berisi karakter meta globbing tanpa tanda kutip seperti *
.
Meskipun hal ini tidak mungkin terjadi dengan token seperti --include=*.html
(mis., Anda harus memiliki file yang secara harfiah dinamai sesuatu yang --include=foo.html
cocok), perlu diingat secara umum.
Jika nullglob
opsi shell kebetulan dihidupkan ( shopt -s nullglob
) dan globbing tidak cocok dengan apa pun , argumen akan dibuang .
Oleh karena itu, untuk solusi yang sepenuhnya kuat , gunakan yang berikut ini:
grep -R '--include=*.'{html,php,htm} pattern /some/path
'--include=*.'
diperlakukan sebagai literal , karena dikutip tunggal ; ini mencegah interpretasi yang tidak disengaja *
sebagai karakter yang menggelembung.
{html,php,htm}
, the - of needs - unquoted brace expansion [1]
, meluas menjadi 3 argumen, yang, karena {...}
mengikuti '...'
token secara langsung , termasuk token tersebut.
Oleh karena itu, setelah penghapusan kutipan oleh shell, berikut 3 literal argumen akhirnya dilewatkan kegrep
:
--include=*.html
--include=*.php
--include=*.htm
[1] Lebih tepatnya, hanya bagian yang relevan dengan sintaks dari perluasan tanda kutip yang harus tidak diberi tanda kutip , elemen daftar mungkin masih dikutip secara individual dan harus berisi karakter meta penggabungan yang dapat mengakibatkan penggumpalan yang tidak diinginkan setelah perluasan tanda kurung; sementara tidak diperlukan dalam kasus ini, di atas dapat ditulis sebagai
'--include=*.'{'html','php','htm'}