在bash / ash脚本读取期间,如何防止ANSI转义键序列被垃圾邮件显示?

时间:2019-02-23 17:47:17

标签: busybox arrow-keys ansi-escape ash

我正在尝试制作一个脚本,该脚本在带有busybox灰的非常有限的系统上处理箭头键,而其他很少。举例来说,不要太笨拙。我有一些可以正常工作的东西,但偶尔会在屏幕上显示一些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

1 个答案:

答案 0 :(得分:0)

问题是

  

它如何通过无声阅读?

这是因为脚本正在将终端切换为静音(无回声)读取所使用的模式,并且当 not 时,shell会回显您的键。 期待输入。您可以通过在脚本运行时使用stty禁用回显(并在退出时恢复回显)来改善此问题。