Вам необходимо перевести стандартный вход в неблокирующий режим.Вот пример, который работает:
#!/bin/bash
if [ -t 0 ]; then stty -echo -icanon -icrnl time 0 min 0; fi
count=0
keypress=''
while [ "x$keypress" = "x" ]; do
let count+=1
echo -ne $count'\r'
keypress="`cat -v`"
done
if [ -t 0 ]; then stty sane; fi
echo "You pressed '$keypress' after $count loop iterations"
echo "Thanks for using this script."
exit 0
Редактировать 2014/12/09: Добавьте флаг -icrnl
к stty
, чтобы правильно перехватить клавишу Return, используйте cat -v
вместо read
для захвата пробела.
Возможно, что cat
читает более одного символа, если он достаточно быстро передает данные;если не соответствует желаемому поведению, замените cat -v
на dd bs=1 count=1 status=none | cat -v
.