我阅读了多个具有不同复杂程度的答案。当手动输入时,大多数都运行良好。
例如:https://stackoverflow.com/a/20913871/1841533。
这是我的示例代码,与该答案中的代码非常接近:
_delay_end_input_=2
printf "%s\n" "answer: "
IFS= read -d '' -n 1 theanswer
while IFS= read -d '' -n 1 -t ${_delay_end_input_} more ; do
theanswer="${theanswer}${more}"
done
当我手动输入答案时,这也很有效,即:逐个字符......
但是如果我粘贴一行(或多行):它在读取每个字符后回显“剩余缓冲区”...使显示变得混乱。
我还没有找到一种方法来隐藏它,同时保持屏幕上的正常回声。 (即,如果输入或粘贴,我仍然想查看输入/粘贴的内容)
简短的示例:这是我逐字符手动输入“abcd”时的(良好)提示:
answer: abcd
但是,如果我通过用鼠标在一个瞬间粘贴“abcd”来提供它,它会在读取每个字符后重复读取剩余的整个缓冲区,从而扰乱回显:
answer: abcdbcdcdd
tl/dr:该片段在逐个字符输入时效果很好,但在读取粘贴条目的每个字符后会回显剩余的读取缓冲区。
答案1
我可能找到了解决方法......但我也希望有人给出更好的东西。
更正的代码:我隐藏了正常的回显,并且在每次读取后我自己回显:
stty_orig=`stty -g` ### added this
stty -echo ### added this
_delay_end_input_=2
printf "%s\n" "answer: "
IFS= read -d '' -n 1 theanswer
printf "$theanswer" >&2 ; ### added this
while IFS= read -d '' -n 1 -t ${_delay_end_input_} more ; do
printf "$more" >&2 ; ### added this
theanswer="${theanswer}${more}"
done
stty $stty_orig ### added this
到目前为止,似乎已经完成了我需要的一切...但我不喜欢以这种方式打印到 stderr...(也许最好改为 printf 到 /dev/tty ?)
编辑: A大的缺点是:很难处理“退格”或删除:如果输入 1 行或多行文本的人想要更改某些内容,则解释更正键非常困难......拥有允许 1 行或多行输入的 readline 会成为这里最好的...(也许 Perl 有一个?)