Saya bermain dengan skrip yang, antara lain, daftar pilihan-daftar. Seperti dalam:
1) Item 1 # (disorot) 2) Butir 2 3) Item 3 # (dipilih) 4) Item 4
- Ketika pengguna menekan
down-arrowitem berikutnya disorot - Saat pengguna menekan
up-arrowitem sebelumnya disorot - dll.
- Ketika
tabitem pengguna tekan dipilih - Ketika pengguna menekan
shift+tabsemua item dipilih / tidak dipilih - Ketika pengguna menekan
ctrl+asemua item dipilih - ...
Ini berfungsi dengan baik pada penggunaan saat ini, yang merupakan penggunaan pribadi saya di mana input difilter oleh pengaturan saya sendiri.
Pertanyaannya adalah bagaimana membuat ini dapat diandalkan di berbagai terminal.
Saya menggunakan solusi yang agak peretasan untuk membaca input:
while read -rsn1 k # Read one key (first byte in key press)
do
case "$k" in
[[:graph:]])
# Normal input handling
;;
$'\x09') # TAB
# Routine for selecting current item
;;
$'\x7f') # Back-Space
# Routine for back-space
;;
$'\x01') # Ctrl+A
# Routine for ctrl+a
;;
...
$'\x1b') # ESC
read -rsn1 k
[ "$k" == "" ] && return # Esc-Key
[ "$k" == "[" ] && read -rsn1 k
[ "$k" == "O" ] && read -rsn1 k
case "$k" in
A) # Up
# Routine for handling arrow-up-key
;;
B) # Down
# Routine for handling arrow-down-key
;;
...
esac
read -rsn4 -t .1 # Try to flush out other sequences ...
esac
done
Dan seterusnya.
Seperti disebutkan, pertanyaannya adalah bagaimana membuat ini dapat diandalkan di berbagai terminal: yaitu urutan byte apa yang menentukan kunci tertentu. Apakah itu layak di bash?
Satu pemikiran adalah menggunakan salah satu dan tputatau infocmpmemfilter berdasarkan hasil yang diberikan oleh hal itu. Namun saya dalam kesulitan karena keduanya tputdan infocmpberbeda dari apa yang sebenarnya saya baca ketika benar-benar menekan tombol. Sama berlaku misalnya menggunakan C over bash.
for t in $(find /lib/terminfo -type f -printf "%f\n"); {
printf "%s\n" "$t:";
infocmp -L1 $t | grep -E 'key_(left|right|up|down|home|end)';
}
Sekuens hasil dibaca seperti yang didefinisikan misalnya linux, tetapi tidak xterm, yang ditetapkan oleh TERM.
Misal panah kiri:
tput/infocmp:\x1 O Dread:\x1 [ D
Apa yang saya lewatkan?
zshmemiliki dukungan kutukan bawaan (dalam modul zsh / kutukan) di samping kueri terminfo dasar dengan array echotibawaan dan $terminfoasosiatifnya.

dialogvarian, atau gunakan bahasa denganncursesdukungan yang layak (perl atau python misalnya, jika Anda ingin tetap menggunakan bahasa "scripting").