检测回车键的Bash代码在交互式Shell中无法正常运行的原因咨询
检测回车键的Bash代码在交互式Shell中无法正常运行的原因咨询
嗨,我来帮你捋捋这段代码为啥在交互式命令行里不好使~
你的代码逻辑本身没毛病,但问题出在终端的默认工作模式上。默认情况下,咱们用的交互式bash终端是「规范模式(canonical mode)」——这个模式下,终端会把你输入的所有字符先缓冲起来,直到你按下回车键,才会把整行内容一次性发送给程序。这就导致你的read -n 1根本没法实时拿到单个字符(包括回车键),因为终端还没把输入传过来呢!
要解决这个问题,咱们可以临时修改终端的模式,让它能实时把每个输入的字符交给程序,具体做法是在循环前用stty命令关闭规范模式,并且记得脚本结束后把终端设置恢复回去,不然退出后你的终端可能会变得怪怪的(比如输入不回显、按回车没反应之类的)。
修改后的代码如下:
# 先保存当前终端设置,方便后续恢复 old_stty=$(stty -g) # 关闭终端规范模式,让字符实时传递 stty -icanon while true do read -r -s -n 1 key # 兼容不同终端的回车键(有些是\n,有些是\r) if [[ "$key" == $'\n' || "$key" == $'\r' ]] then echo "Breaking loop..." break fi done # 恢复终端原来的设置 stty "$old_stty"
另外补充个小细节:不同终端里,回车键对应的字符可能是换行符\n或者回车符\r,所以把判断条件改成同时匹配这两个字符,能让代码兼容性更好~
备注:内容来源于stack exchange,提问作者Melab




