3

在设置 stty -icanon time 0 min 0 以防止读取阻塞后,我有一个循环。

它工作正常,只是它无法读取输入/返回键。

有没有办法在这种模式下读取回车键,或者我的代码可以用任何其他方式编写?

相关代码

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
4

1 回答 1

2

你可以通过阅读来做到这一点

  • 取消 IFS
  • 不使用任何行分隔符
  • 一次准确读取 1 个字符

.

IFS= read -t 0.01 -d '' -n1 keypress

例如,这里我们输入a, space, 然后return:

$ IFS= 读取 -t 0.01 -s -d '' -n1 按键;echo "\"$keypress\""
“一个”
$ IFS= 读取 -t 0.01 -s -d '' -n1 按键;echo "\"$keypress\""
" "
$ IFS= 读取 -t 0.01 -s -d '' -n1 按键;echo "\"$keypress\""
"
"
$

-s在上面的示例中添加了标志来抑制对 的回显输入read,因此它不会混淆输出的内容。这不是上述工作所必需的。

编辑:

直到我看到您的评论,我才意识到您实际上想要非阻塞模式进行阅读。这更难。我能想到的最好的办法是在你的读取命令中设置一个小的(10 毫秒)超时。这会在您的事件循环中产生 10 毫秒延迟的不幸影响,这可能是可接受的,也可能是不可接受的。对我来说,更小的超时会导致 bash 表现不佳,而 0 超时似乎根本不起作用。

于 2014-03-26T16:37:13.350 回答