Saya ingin mencari semua file di direktori yang berisi -2
.
Menggunakan ls | grep "-2"
pengembalianusage: grep...
Menggunakan tanda kutip tunggal sebagai ganti tanda kutip ganda menghasilkan hal yang sama, dan juga tidak menggunakan tanda kutip sama sekali, saat mencari hal lain dengan benar mengembalikan nama file yang cocok.
Seingat saya -
bukan karakter khusus regex.
Tolong jangan fokus pada masalah khusus menemukan file dengan nama. Saya terutama ingin memahami mengapa grep bersikap seperti ini.
Menggunakan bash di macOS 10.13
ls | grep -e "-2"
akan berhasil. Katakan saja grep itu ekspresi. Tampaknya tanda hubung dibaca sebagai opsi. Pasti pipa.-2
sebagai parameter baris perintah, terlepas dari fakta itu dibungkus oleh tanda kutip.grep -- -2
ataugrep -- "-2"
Jawaban:
grep
tidak tahu apakah parameter dibungkus oleh tanda kutip atau tidak.Banyak langkah penguraian dilakukan oleh shell itu sendiri 1 sebelum mengeksekusi apa saja -
>
pengalihan diterapkan,$
variabel diperluas,*
wildcard diperluas,|
pipa dipisah menjadi seperangkat perintah individu, dan setiap perintah dibagi menjadi array kata-kata.Jadi apakah Anda menjalankan
grep -2
,grep '-2'
,grep \-2
, atau bahkanx=-2; grep $x
, shell masih melihatnya sebagai daftar yang sama parameter: {grep
,-2
}. Inilah yang akan diteruskan ke panggilan sistem execv (), dan inilah yang akan diterima program grep dalam lariknyaargv[]
, terlepas dari kutipan aslinya.1 Bahkan di Windows, di mana baris perintah di CreateProcess () hanya sebuah string tunggal, sebagian besar port grep akan tetap memiliki perilaku ini karena pustaka runtime C melakukan arg-splitting yang sama selama inisialisasi.
sumber
-e
akan berlalu{ grep, "-2" }
? karena ini berfungsi seperti yang disebutkan dalam komentar saya ke OP{ grep, -e, -2 }
. Tetapi grep tahu bahwa-e
dibutuhkan tepat satu parameter, jadi yang berikut-2
akan dikonsumsi sebagai parameter -e daripada opsi mandiri.