在读取 bash/ash 脚本期间,如何防止 ANSI 转义键序列显示为垃圾信息?
How do I prevent ANSI escape key sequences from spamming display during read in bash/ash script?
我正在尝试制作一个脚本,在一个非常有限的系统上使用 busybox ash 和其他很少的东西来处理箭头键。例如,没有 stty。我有一些大部分都有效但偶尔会在屏幕上显示一些 ANSI 转义序列的东西。这似乎最常发生在自动键重复启动时,但也发生在读取下一个键之前必须完成更复杂的处理时。这在我的笔记本电脑上效果很好,它比我的目标系统更快,但如果我偶尔按住箭头键,屏幕上会出现 ^[[B 之类的东西。它是如何通过静默阅读的?
我没有明确处理 HOME 和 END,所以 ^[OH 和 ^[OF 更频繁地通过。这让我觉得也许他们在超时期间泄漏了,但我真的不知道。
无论如何,管道或子外壳是否有一些技巧可能包含逃逸者?
E=$(printf "3")
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
问题是
How does it get past the silent reads?
那是因为脚本正在切换终端 in/out 用于静默(无回显)读取的模式,并且当 [=16] 时 shell 会回显您的键=]不 期待输入。您可以通过在脚本 运行 时使用 stty 禁用回显来改进这一点(并在退出时恢复回显)。
我正在尝试制作一个脚本,在一个非常有限的系统上使用 busybox ash 和其他很少的东西来处理箭头键。例如,没有 stty。我有一些大部分都有效但偶尔会在屏幕上显示一些 ANSI 转义序列的东西。这似乎最常发生在自动键重复启动时,但也发生在读取下一个键之前必须完成更复杂的处理时。这在我的笔记本电脑上效果很好,它比我的目标系统更快,但如果我偶尔按住箭头键,屏幕上会出现 ^[[B 之类的东西。它是如何通过静默阅读的?
我没有明确处理 HOME 和 END,所以 ^[OH 和 ^[OF 更频繁地通过。这让我觉得也许他们在超时期间泄漏了,但我真的不知道。
无论如何,管道或子外壳是否有一些技巧可能包含逃逸者?
E=$(printf "3")
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
问题是
How does it get past the silent reads?
那是因为脚本正在切换终端 in/out 用于静默(无回显)读取的模式,并且当 [=16] 时 shell 会回显您的键=]不 期待输入。您可以通过在脚本 运行 时使用 stty 禁用回显来改进这一点(并在退出时恢复回显)。