シェルスクリプトでキー入力のイベントを受け取る
read -t 1 の代替手段って何か無いかな。
— いわもと こういち (@ttdoda) September 10, 2019
for i in 3 2 1; do
printf "%d 秒後に画面を再描画します\r" $i
read -t 1 && break
done
みたいに、基本3秒待つけれど Return を入力したらすぐに次に進むってのをやりたいんだけれど。
端末に詳しくないので何か穴がないかわからないですが、こんなのが見つかりました。https://t.co/rVTZ9xISHc
— ふみやす@シェルまおう(自称でない) FGO:838,149,789 (@satoh_fumiyasu) September 10, 2019
read -t N
のPOSIXシェルの範囲内でできる代替って無いのかなというのは以前から気になってたので、このやりとりを見つけてかなりすっきりしました。
min
とtime
はたしかにPOSIXに記載があります。
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/stty.html
ここで紹介されていた方法を応用すると、ゲームっぽいものもつくれそうな気がします。
#!/bin/sh
getch() {
old=$(stty -g)
stty raw -echo min 0 time 1
printf '%s' $(dd bs=1 count=1 2>/dev/null)
stty $old
}
print_aa() {
_pos="${1}"
_state="${2}"
if [ "${_state}" = "0" ]; then
_format="% ${_pos}s\\(^q^)/"
elif [ "${_state}" = "1" ]; then
_format="% ${_pos}s/(^q^)\\"
fi
printf "${_format}"
}
pos=0
aa_state=0
aa_state_change_count=0
clear
print_aa "${pos}"
while :; do
c=$(getch)
case ${c} in
"q" )
break
;;
"h" )
[ "${pos}" -gt 0 ] && pos=$((pos-1))
;;
"l" )
[ "${pos}" -lt 30 ] && pos=$((pos+1))
;;
* )
;;
esac
if [ "${aa_state_change_count}" -lt 4 ]; then
aa_state_change_count=$((aa_state_change_count + 1))
else
aa_state_change_count=0
if [ "${aa_state}" = "0" ]; then
aa_state=1
else
aa_state=0
fi
fi
clear
print_aa "${pos}" "${aa_state}"
done
clear
h
を押すと左に、l
を押すと右に、q
を押すと終了します。
入力がある場合も最低何ミリ秒待つみたいなことができそうにないので、本当にゲームをつくるのは厳しいかも。
Author And Source
この問題について(シェルスクリプトでキー入力のイベントを受け取る), 我々は、より多くの情報をここで見つけました https://qiita.com/miminashi/items/ad060c43c130581b412a著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .