/ / Ako čítať návrat, keď sa používa stty -icanon - bash, stty

Ako čítať návrat pri použití stty -icanon-bash, stty

Po nastavení času stty -icanon 0 min 0 mám slučku, aby som zabránil blokovaniu čítania.

Funguje to dobre, okrem toho, že nedokáže prečítať kláves Enter / Return.

Existuje nejaký spôsob, ako čítať kláves Enter v tomto režime, alebo iný spôsob, ako by som mohol napísať môj kód?

Príslušný kódex

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

odpovede:

2 pre odpoveď č. 1

Môžete to urobiť pomocou prečítania

  • deaktivácia IFS
  • nepoužíva žiadne oddeľovače riadkov
  • čítanie presne 1 znaku naraz

.

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

Napríklad tu vstúpime a, priestor, potom spiatočný:

$ IFS = prečítané -t 0.01-s-d "" -n1 stlačenie klávesu; echo "" $ keypress "" "A" $ IFS = čítanie -t 0,01-s-d "" -n1 stlačenie klávesu; echo "" $ keypress "" „“ $ IFS = čítanie -t 0,01-s-d "" -n1 stlačenie klávesu; echo "" $ keypress "" " " $

Pridal som -s vo vyššie uvedených príkladoch označte príznak na potlačenie ozvučeného vstupu read, takže nezmýľte, čo je výstupom. Nie je potrebné, aby vyššie uvedené fungovali.

edit:

Neuvedomil som si, že skutočne chceteneblokujúci režim pre vaše čítania, až kým neuvidím váš komentár. To je ťažšie. Najlepšie na čo prídem, je, aby ste do príkazu na čítanie vložili malý (10 ms) časový limit. To má nešťastný účinok 10-sekundového oneskorenia vo vašej slučke udalostí, čo môže alebo nemusí byť prijateľné. Pre mňa oveľa menšie časové limity spôsobili, že sa bash choval zle, a zdá sa, že časový limit 0 vôbec nefunguje.