Mengapa saya harus melarikan diri "titik" dua kali?


13

Saya tahu bahwa kita dapat melarikan diri karakter khusus seperti *(){}$dengan \sehingga dapat dianggap literal.
Misalnya \*atau\$

Tetapi dalam kasus .saya harus melakukannya dua kali, seperti \\.kalau tidak itu dianggap karakter khusus. Contoh:

man gcc | grep \\.

Kenapa gitu?


Bisakah Anda memberi kasing bahwa Anda harus melarikan diri dua kali?
cuonglm

man bash|grep \\.bisa jadi contoh.
Pengguna Terdaftar

3
Lebih tepatnya, Anda tidak melarikan diri dari titik dua kali, Anda melarikan diri dari karakter melarikan diri sehingga akan diteruskan ke grep
Cthulhu

5
Anda bisa menggunakan tanda kutip untuk menghindari melarikan diri karakter backslash: man gcc | grep '\.'.
Leonid Beschastny

1
Saya sangat suka saran LeonidBeschastny karena seberapa jauh lebih jelas apa yang terjadi
Izkata

Jawaban:


24

Secara umum, Anda hanya perlu melarikan diri satu kali untuk membuat karakter khusus dianggap literal. Kadang Anda harus melakukannya dua kali, karena pola Anda digunakan oleh lebih dari satu program.

Biarkan diskusikan contoh Anda:

man gcc | grep \\.

Perintah ini diinterpretasikan oleh dua program, bashinterpreter dan grep. Penyebab pelarian pertama bashtahu \adalah literal, jadi yang kedua adalah lolos grep.

Jika Anda melarikan diri hanya satu kali, \., bashakan tahu titik ini literal, dan lulus .untuk grep. Ketika grepmelihat ini ., ia mengira titik adalah karakter khusus, bukan literal.

Jika Anda melarikan diri dua kali, bashakan melewati pola \.untuk grep. Sekarang grepketahuilah bahwa itu adalah titik literal.


: Jadi, Apakah karakter pelolosan untuk titik tergantung pada jumlah pipa yang kita gunakan?. Misalnya cmd | cmd | cmd | cmd Apakah itu benar????
Thushi

6
@ Thushi: Tidak. Ini tidak ada hubungannya dengan fakta bahwa Anda menggunakan (atau beberapa) karakter pipa, tetapi berlaku bahkan untuk grep \\. my_file. Baris perintah ditafsirkan oleh shell, menggunakan yang pertama \ untuk melarikan diri yang kedua, sehingga orang \ dilewatkan secara harfiah untuk grep. Titik .ini tidak khusus untuk shell, jadi itu tetap kata demi kata. Grep kemudian membaca (tunggal) \ dan menggunakannya untuk menghindari titik ..
Ansgar Esztermann

@AnsgarEsztermann: Ya. Itu benar. Memeriksa itu. Terima kasih :)
Thushi

2
Saya percaya jawabannya agak salah karena mengatakan "Pelarian pertama menyebabkan bash tahu. Secara literal, yang kedua adalah untuk grep.". Sebenarnya, pelarian pertama membuat bash tahu bahwa \ adalah leteral, dan lulus \. untuk grep.
Cthulhu

@ Gouc saya tidak berpikir itu. echo .di bash saja ... gema .karakter bach .
Cthulhu
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.