我试图在 shell 脚本中捕获按键(例如使用read
)而不是回显它。我发现的三种方法是stty -echo
,-s
交换机和流重定向。
然而,在似乎使用 FreeBSD 实现的 macOS 上,这些都不能一致地工作。
以下脚本显示了该问题:
while true; do
stty -echo
read -s -n 1 CHAR &>/dev/null
stty echo
done
同时按下向上和向下箭头时,有时会出现命令回显A^[[B
或 的情况B^[[A
。当机器速度缓慢(由于电池电量不足)时,这种情况尤其常见,表明存在某种竞争状况。
我错过了什么吗?否则,我该如何解决这个问题?
答案1
在循环中,循环末尾的“stty echo”与下一次迭代的“stty -echo”之间有一个很短的时间窗口。在此窗口期间接收到的键盘输入将被回显,即使没有读取命令正在等待它。如果你不想要回声,就不要调用“stty echo”