Backspace tidak berfungsi di dalam menjalankan skrip bash

8

Saya menjalankan skrip yang sangat sederhana yang bertuliskan baris per baris dan cetakan masuk baris kembali ke terminal:

while read CMD; do
    echo $CMD
done

Ini berfungsi dengan baik, tetapi ketika saya mencoba mengedit baris dengan backspacekarakter, ia mencetak ^?bukannya menghapus karakter. Dan ketika saya menekan Ctrl+ backspacehasilnya ^H. Bagaimana perilaku ini diperbaiki sehingga backspacemenghapus karakter alih-alih menambahkan karakter ini? Saya mencoba stty erase '^?'perintah tetapi tidak berhasil.

vrom911
sumber
Harap dicatat 16,10 mencapai akhir dari siklus dukungannya bulan lalu. Anda harus meningkatkan ke 17,04 sesegera mungkin.
Byte Commander
1
Saya sarankan untuk mengganti read CMDdengan read -e CMD.
Cyrus
1
coba terminatorbukan gnome-terminal. Ini berfungsi seperti yang diharapkan
Severus Tux
1
@whtyger ini berfungsi untuk skrip ini. Dalam situasi nyata saya, saya mendapat masukan dari program, yang tidak memanggil read. Saya tidak punya kesempatan untuk mengubah skrip program, ini hanya contoh yang mewakili masalah saya. Apakah ada pengaturan global di mana saya dapat melakukan konfigurasi ini untuk semua input?
vrom911
1
@Cyrus My Backspace berfungsi seperti yang saya inginkan - ini menghapus karakter terakhir selalu, bahkan untuk skrip ini dari pertanyaan tanpa -eopsi. Tetapi pada mesin @ vrom911 bukan itu masalahnya. Saya bertanya-tanya mengapa itu terjadi dan di mana ini dapat dikonfigurasi.
Shersh

Jawaban:

6

Masalahnya adalah bahwa ada banyak cara untuk mewakili backspace, tetapi readperintahnya tidak mengerti semuanya. Anda harus dapat mengkonfigurasi apa yang sebenarnya dikirim ketika menekan ← Backspacetombol di pengaturan emulator terminal Anda.

Dengan asumsi Anda menggunakan gnome-terminalemulator, buka Edit manu dan klik Preferensi profil . Beralih ke tab Kompatibilitas dan Anda harus mendapatkan opsi ini:

gnome-terminal → preferensi profil → kompatibilitas

Sekarang Anda dapat mengubah kunci Backspace menghasilkan: pengaturan. Anda memiliki lima opsi di bawah ini yang tersedia untuk dipilih. Saya menambahkan dalam kawat gigi bagaimana mereka berperilaku pada sistem saya:

  • Otomatis (bekerja)
  • Control-H ( ^Hbukan cetak )
  • ASCII DEL (default, berfungsi)
  • Urutan melarikan diri ( ^[[3~sebagai gantinya dicetak )
  • TTY Erase (berfungsi)
Komandan Byte
sumber
Saat ini saya punya ASCII DEL. Saya telah mencoba semua 5 opsi tetapi tidak satupun dari mereka memperbaiki masalah ini.
vrom911
Itu aneh. Bisakah Anda memberi tahu saya apa yang type readdikatakan dan $SHELL --versionlaporan shell / versi apa ?
Byte Commander
Saya tahu ini aneh. Saya banyak mencoba google masalah saya tetapi tidak menemukan solusi yang bekerja untuk saya. type readkata read is a shell builtin. dan $SHELL --versionmengatakanGNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
vrom911
1

Saya memiliki masalah yang sama, menggunakan bash di Gnome-Terminal.

Perhatikan bahwa pada baris perintah, backspace berfungsi seperti yang diharapkan, tetapi ketika program saya (klien obrolan berbasis soket TCP sederhana) membaca dari stdin, backspacekarakter mencetak (menggema kembali ke layar) ^?alih-alih menghapus karakter terakhir.

Gunakan # stty icanonuntuk memungkinkan mode "kanonik (matang)". Lihat beberapa penjelasan di sini /unix/131105/how-to-read-over-4k-input-without-new-lines-on-a-terminal

Beberapa latar belakang untuk masalah / solusi saya: Saya punya masalah di mana saya perlu menempelkan lebih dari 4k karakter. Dan selama penelitian itu, saya diarahkan ke tautan di atas. Saya dulu # stty -icanonmenonaktifkan batas 4k, tetapi kehilangan kemampuan untuk menggunakan backspace (menghapus).

roger
sumber