在读取 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 禁用回显来改进这一点(并在退出时恢复回显)。