У мене є цикл після встановлення stty -icanon час 0 хв 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
Відповіді:
2 для відповіді № 1Це можна зробити за допомогою прочитаного
- неспокійний IFS
- не використовуючи жодних роздільників ліній
- читаючи рівно 1 знак за один раз
.
IFS= read -t 0.01 -d "" -n1 keypress
Наприклад, сюди ми входимо a, простір, потім повернутися:
$ IFS = read -t 0.01 -s -d "" -n1 клавіша; echo "" $ keypress "" "a" $ IFS = прочитати -t 0.01 -s -d "" -n1 клавішу; echo "" $ keypress "" "" $ IFS = прочитати -t 0.01 -s -d "" -n1 клавішу; echo "" $ keypress "" " " $
Я додав -s
прапор у наведених вище прикладах, щоб придушити повторений вхід read
, тож це не заплутує те, що виводиться. Це не обов'язково, щоб вищезгадане працювало.
Редагувати:
Я не оцінив, що ти фактично хочешрежим, що не блокує ваші читання, поки я не побачив ваш коментар. Це важче. Найкраще, що я можу зрозуміти, - це ввести невелику (10 мсек) час у вашій команді читання. Це призводить до нещасного ефекту від затримки в циклі подій на 10 секунд, що може бути або не бути прийнятним. Для мене набагато менші тайм-аути змусили баш поводити себе погано, а час очікування 0, схоже, не працює.