Bash 使用stty-icanon时如何读取返回
我在设置stty-icanon time 0 min 0后有一个循环,以防止读取阻塞 除了无法读取回车键外,它工作正常 有没有办法在这种模式下读取enter键,或者有没有其他方法可以编写我的代码 相关代码Bash 使用stty-icanon时如何读取返回,bash,stty,Bash,Stty,我在设置stty-icanon time 0 min 0后有一个循环,以防止读取阻塞 除了无法读取回车键外,它工作正常 有没有办法在这种模式下读取enter键,或者有没有其他方法可以编写我的代码 相关代码 您可以使用Readby来完成此操作 不稳定的国际单项体育联合会 不使用任何行分隔符 一次只读取1个字符 例如,在此处输入一个空格,然后返回: $IFS=read-t0.01-s-d'-n1按键;回显“\”$keypress” “a” $IFS=read-t0.01-s-d'-n1按键;回
您可以使用Readby来完成此操作
- 不稳定的国际单项体育联合会
- 不使用任何行分隔符
- 一次只读取1个字符
-s
标志,以抑制读取的回显输入,因此不会混淆输出内容。上述操作不需要这样做
编辑:
直到我看到你的评论,我才意识到你实际上需要非阻塞模式来阅读。这更难。我能想出的最好办法是在read命令中设置一个小的(10毫秒)超时。这会在事件循环中造成10毫秒的延迟,这可能是不可接受的,也可能是不可接受的。对我来说,小得多的超时会导致bash表现不好,而0超时似乎根本不起作用。我认为问题在于,read
如果只收到一个换行符,它将不返回任何内容。这就是我所想的,我环顾四周,只能找到[read]作为接收用户输入的一种方式,你知道阅读笔画的其他功能或方法吗?嗨,谢谢你的回答。你会把它放在我贴的代码里的什么地方?如果我把它放在当前读取的循环中,那么它将阻塞,直到我输入一些内容。@Jidder抱歉,我没有意识到您需要非阻塞读取。我做了一个编辑,可能对你有用,也可能没用。
tput smcup
Draw
if [ -t 0 ]; then stty -icanon time 0 min 0; fi
count=0
keypress=''
while [ "$keypress" != "q" ]; do
sleep 0.1
(( count = count + 1 ))
rows=$(tput lines)
columns=$(tput cols)
Draw
read keypress
name=$name$keypress
echo $name
if [[ $oldcolumns != $columns || $oldrows != $rows ]];then
Draw
oldcolumns=$columns
oldrows=$rows
elif [[ $count -eq 1 ]]; then
# Draw
count=0
fi
done
if [ -t 0 ]; then stty sane; fi
tput rmcup
#rm tail.tmp
echo "Thanks for using this script."
exit 0
IFS= read -t 0.01 -d '' -n1 keypress
$ IFS= read -t 0.01 -s -d '' -n1 keypress ; echo "\"$keypress\""
"a"
$ IFS= read -t 0.01 -s -d '' -n1 keypress ; echo "\"$keypress\""
" "
$ IFS= read -t 0.01 -s -d '' -n1 keypress ; echo "\"$keypress\""
"
"
$