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 backspace
karakter, ia mencetak ^?
bukannya menghapus karakter. Dan ketika saya menekan Ctrl
+ backspace
hasilnya ^H
. Bagaimana perilaku ini diperbaiki sehingga backspace
menghapus karakter alih-alih menambahkan karakter ini? Saya mencoba stty erase '^?'
perintah tetapi tidak berhasil.
command-line
bash
vrom911
sumber
sumber
read CMD
denganread -e CMD
.terminator
bukangnome-terminal
. Ini berfungsi seperti yang diharapkan-e
opsi. Tetapi pada mesin @ vrom911 bukan itu masalahnya. Saya bertanya-tanya mengapa itu terjadi dan di mana ini dapat dikonfigurasi.Jawaban:
Masalahnya adalah bahwa ada banyak cara untuk mewakili backspace, tetapi
read
perintahnya tidak mengerti semuanya. Anda harus dapat mengkonfigurasi apa yang sebenarnya dikirim ketika menekan ← Backspacetombol di pengaturan emulator terminal Anda.Dengan asumsi Anda menggunakan
gnome-terminal
emulator, buka Edit manu dan klik Preferensi profil . Beralih ke tab Kompatibilitas dan Anda harus mendapatkan opsi ini: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:
^H
bukan cetak )^[[3~
sebagai gantinya dicetak )sumber
type read
dikatakan dan$SHELL --version
laporan shell / versi apa ?type read
kataread is a shell builtin
. dan$SHELL --version
mengatakanGNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
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,
backspace
karakter mencetak (menggema kembali ke layar)^?
alih-alih menghapus karakter terakhir.Gunakan
# stty icanon
untuk memungkinkan mode "kanonik (matang)". Lihat beberapa penjelasan di sini /unix/131105/how-to-read-over-4k-input-without-new-lines-on-a-terminalBeberapa 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 -icanon
menonaktifkan batas 4k, tetapi kehilangan kemampuan untuk menggunakan backspace (menghapus).sumber