ちょっとやり過ぎです!
dialog
そのため、最初に、whiptail
およびその他curses
のシェルのラッパーをご覧になることをお勧めします。
しかし、これでうまくいく可能性があります。(私はあなたがそれらを生産段階に置かないことを願っています;-)
$ char=""; while [ ! "$char" ] ;do
char="$(
(
stty -echo raw
dd bs=1 if=/dev/tty of=/dev/fd/4 >/dev/null 2>&1 &
sleep .1
kill $! 2>/dev/null
stty sane
) 4>&1 >/dev/null
)"
done
$ echo -n "$char" | od -A n -t c
033 [ 2 4 ~
更新されました(再度)
... 0.1 秒以内に 2 つの異なるキーを押さないと仮定します。(これは真実ではないかもしれませんが、ダイアログメニューの場合、これは可能性があります...)
そこから:
readKey() {
local char
while [ ! "$char" ] ;do
char="$(
(
stty -echo raw
dd bs=1 if=/dev/tty of=/dev/fd/4 >/dev/null 2>&1 &
sleep .1
kill $! 2>/dev/null
stty sane
) 4>&1 >/dev/null
)"
done
printf -v ${1:-REPLY} "$char"
}
str=""
while [ "$str" != "exit" ] ;do
readKey KEY
str+="$KEY"
[ ${#str} -gt 4 ] && str="${str:${#str}-4}"
case "$KEY" in
$'\x1b[A') echo "press arrow up";; # OK
$'\x1b[B') echo "press arrow down";; # OK
$'\x1b[15~') echo "press key F5";; # Ok, for me.
* ) echo "pressed: '$(echo -n "$KEY"| od -A n -t c)'" ;;
esac
done
いくつかのキーを押すより...
press key F5
press arrow up
press arrow down
pressed: ' 033 [ F'
pressed: ' 033 [ 6 ~'
pressed: ' 033 [ 3 ~'
pressed: ' q'
pressed: ' e'
pressed: ' x'
pressed: ' i'
pressed: ' t'
e x i t
ループを終了するためのヒット。