/ / Як читати return при використанні stty -icanon - bash, stty

Як прочитати повернення при використанні stty-casanon - bash, stty

У мене є цикл після встановлення 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, схоже, не працює.