angka grep minus tidak berfungsi

0

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

Teejay
sumber
1
Saya setuju. Aneh. Tidak tahu. Tapi ls | grep -e "-2"akan berhasil. Katakan saja grep itu ekspresi. Tampaknya tanda hubung dibaca sebagai opsi. Pasti pipa.
Zina
Terima kasih. Itu seperti jika ia menafsirkan -2sebagai parameter baris perintah, terlepas dari fakta itu dibungkus oleh tanda kutip.
Teejay
2
Gunakan: grep -- -2ataugrep -- "-2"
Cyrus

Jawaban:

1

Ini seperti jika menafsirkan -2 sebagai parameter baris perintah, terlepas dari fakta itu dibungkus oleh tanda kutip.

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 bahkan x=-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 lariknya argv[], 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.

grawity
sumber
begitu juga -eakan berlalu { grep, "-2" }? karena ini berfungsi seperti yang disebutkan dalam komentar saya ke OP
Zina
1
Tidak, itu akan berlalu { grep, -e, -2 }. Tetapi grep tahu bahwa -edibutuhkan tepat satu parameter, jadi yang berikut -2akan dikonsumsi sebagai parameter -e daripada opsi mandiri.
grawity