You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MacOS下Bash终端捕获按键及添加ESC键退出循环的问题咨询

MacOS Bash终端ESC键捕获失效的解决方法

问题出在按下单独ESC键时,代码里的read -rsn2 b会等待额外2个字符输入,导致无法触发$ESC) break ;;的分支。因为单独按ESC没有后续字符,这个read会一直阻塞,直到超时或者输入其他字符,自然无法匹配到单独的ESC。

修改方案:给第二个read添加超时参数-t 0.1,如果在0.1秒内没有后续输入,就判定是单独的ESC键,具体代码如下:

#!/bin/bash

ESC=$'\033'
IFS=''

while true; do
    read -rsn1 a
    b=""
    # 若首字符是ESC,尝试读取后续字符,超时0.1秒
    if [[ $ESC == $a ]]; then
        read -rsn2 -t 0.1 b
    fi

    input=$a$b

    case $input in
        $ESC[A) echo UP ;; 
        $ESC[B) echo DOWN ;; 
        $ESC[C) echo RIGHT ;; 
        $ESC[D) echo LEFT ;; 
        $ESC) break ;; # 现在可以正常触发
        '') echo ENTER ;; 
        q) break ;; 
    esac
done

关键修改点

  • 给第二个read命令添加-t 0.1参数:设置0.1秒的超时时间,当按下单独ESC时,后续没有输入,read会超时并返回非0状态,此时b保持为空,input就等于单独的ESC,就能匹配到退出分支。
  • 提前初始化b="":避免之前的残留值影响判断。

内容的提问来源于stack exchange,提问作者martpet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 03:50:34