我正在尝试制作一个脚本,在一个非常有限的系统上处理箭头键,其中包含busybox ash和其他很少的东西。例如,没有stty。我有一些主要工作,但有时一些ANSI转义序列出现在屏幕上。这似乎最常发生在自动键重复启动时,但在读取下一个键之前必须进行更复杂的处理时。这在我的笔记本电脑上比我的目标系统更快,但如果我按住箭头键偶尔会像^ [[B出现在屏幕上。它是如何通过无声读取的?
我没有明确处理HOME和END所以^ [OH和^ [OF更经常地通过。这让我觉得他们可能会在超时期间泄漏,但我真的不知道。
无论如何,是否有一些可能包含逃逸者的管道或子壳的技巧?
E=$(printf "\033")
NL='
'
# Works in bash, ash without stty but takes a sec for ESC key (not ESC sequence)
# But even with nothing but q key checks in the loop it still occasionally
# spams the screen with ^[[B etc if I hold arrow keys down for auto-repeat.
while true; do
IFSBAK=$IFS ; IFS=
read -rsn1 _KEY
case "${_KEY}" in
"${E}") _K=""; read -sn2 -t1 _K; _KEY="${E}${_K}";
case "${_K}" in
"[A"|"[B"|"[C"|"[D"|"") ;;
"OP"|"OQ"|"OR"|"OS") ;;
*) _K=""; read -n1 -t1 _K; _KEY="${_KEY}${_K}" ;;
esac
;; "") _KEY="NL"
;;
esac
IFS=$IFSBAK ; IFSBAK=
case "$_KEY" in
"${E}" | q )
break;;
esac
done
问题是
它是如何通过无声读取的?
这是因为脚本正在将终端切换为用于静默(无回声)读取的模式,并且当不期望输入时,您的密钥会被shell回显。您可以通过使用stty在脚本运行时禁用echo来改进此功能(并在退出时恢复回显)。