我有一个像这样的sh脚本:
while true
do
read -sn1 input
<do something>
done
我的意思是我将从键盘输入输入(箭头键),然后做一些事情(例如:睡眠1)。
我的问题是如果我快速按下箭头键,read
无法接受我的输入(正在处理),并且终端中的转义序列显示。
这不是我的期望。
你知道如何防止这个问题吗?
如果难以理解,我将解释如下:
read -sn1 input <-- press arrow key
sleep 1
. <-- press arrow key ==> display escape sequence in terminal
.
.
read -sn1 input <-- maybe take input from above key press
答案 0 :(得分:0)
有一个以上的问题,但开始的问题是你的read
命令只读取一个字符,而箭头键通常只发送一个字符。您显然正在使用bash
,其中-n
的 read
选项记录为
-n nchars
read returns after reading nchars characters rather than
waiting for a complete line of input, but honor a delim‐
iter if fewer than nchars characters are read before the
delimiter.
通常(特定于bash)的方法是使用超时,也记录read
:
-t timeout
Cause read to time out and return failure if a complete
line of input is not read within timeout seconds. time‐
out may be a decimal number with a fractional portion
following the decimal point. This option is only effec‐
tive if read is reading input from a terminal, pipe, or
other special file; it has no effect when reading from
regular files. If timeout is 0, read returns success if
input is available on the specified file descriptor,
failure otherwise. The exit status is greater than 128
if the timeout is exceeded.
过去 - 当您的备用脚本处于休眠状态时,终端将返回echo模式。通常的方法是使用stty
操纵终端模式,将其置于无回声模式,同时减少超时,而不是使用bash(有时是有用的)功能。之前已经回答过,例如 How to display the key pressed by the user?