Bagaimana cara menangani backspace saat membaca?


10

Bagaimana cara menangani ruang mundur yang dimasukkan, ini menunjukkan ^?jika dicoba & bagaimana readmenghitung karakter, seperti yang 12^?3sudah 5 karakter selesai (meskipun semuanya bukan input sebenarnya), tetapi setelah 12^?3^?itu mengembalikan prompt, aneh. Tolong bantu!

-bash-3.2$ read -n 5
12^?3^?-bash-3.2$

Jawaban:


10

Ketika Anda membaca seluruh baris dengan polos read(atau read -ropsi lain yang tidak mempengaruhi perilaku ini), editor baris yang disediakan kernel mengenali Backspacekunci untuk menghapus satu karakter, serta beberapa perintah lainnya (termasuk Returnuntuk menyelesaikan input baris dan kirim). Tombol pintas dapat dikonfigurasi dengan sttyutilitas. Terminal dikatakan dalam mode matang ketika editor lini aktif. Dalam mode mentah, setiap karakter yang diketik pada keyboard segera dikirim ke aplikasi. Dalam mode matang, karakter disimpan dalam buffer dan hanya baris lengkap yang dikirimkan ke aplikasi.

Untuk berhenti membaca setelah sejumlah karakter tetap untuk diimplementasikan read -n, bash harus beralih ke mode mentah. Dalam mode mentah, terminal tidak melakukan pemrosesan Backspacekunci (pada saat Anda menekan Backspace, karakter sebelumnya telah dikirim ke bash), dan bash tidak melakukan pemrosesan apa pun (mungkin karena ini memberikan fleksibilitas yang lebih besar memungkinkan skrip untuk melakukan pemrosesan sendiri).

Anda dapat memberikan opsi -euntuk mengaktifkan editor baris bash sendiri (readline, yang merupakan editor baris yang tepat, tidak seperti kernel yang sangat kasar). Karena bash melakukan edisi baris, bash dapat berhenti membaca setelah jumlah karakter yang diminta.


9

Gunakan read -e:

$ read -e -n 5
13acX

read -e maksudnya:

Readline (lihat Pengeditan Baris Perintah ) digunakan untuk mendapatkan baris.

Ketika Anda melakukannya, Anda dapat mengedit input dengan cara apa pun yang Anda lakukan saat menulis di prompt shell biasa, termasuk backspace Home,, dan sebagainya.


1

readadalah bash builtin. (lihat type read.) Anda dapat menemukan dokumentasi dengan man bash:

   read [-ers] [-a aname] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...]
   [...]
          -e     If the standard input is coming from a terminal, readline (see READLINE above) is used to obtain the line.
                 Readline uses the current (or default, if line editing was not previously active) editing settings.

atau Anda dapat menggunakan help read:

read: read [-ers] [-a array] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...]
      -e                use Readline to obtain the line in an interactive shell

The -eberalih memungkinkan dukungan readline yang pada dasarnya memungkinkan semua fitur yang tersedia pada prompt shell, termasuk penanganan backspace.

Karena itu read -en 5harus melakukan apa yang Anda inginkan.


-e memecahkan masalah tetapi bagaimana readmembaca 'jumlah karakter yang dimasukkan' masih belum terjawab.
Keyshov Borate
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.