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

问题描述 投票:0回答:1

我正在尝试制作一个脚本,在一个非常有限的系统上处理箭头键,其中包含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
busybox arrow-keys ansi-escape ash
1个回答
0
投票

问题是

它是如何通过无声读取的?

这是因为脚本正在将终端切换为用于静默(无回声)读取的模式,并且当不期望输入时,您的密钥会被shell回显。您可以通过使用stty在脚本运行时禁用echo来改进此功能(并在退出时恢复回显)。

© www.soinside.com 2019 - 2024. All rights reserved.