Bash читать и ждать, даже после ввода - PullRequest
0 голосов
/ 09 ноября 2019

В bash я хочу прочитать ввод данных от пользователя и ждать даже после нажатия клавиши. Я использую

read -n 1 -s -t 0.05 key

, но после ввода он перестает ждать. Я хочу подождать 0,05, несмотря ни на что, и сохранить первую нажатую клавишу в переменной клавише.

1 Ответ

0 голосов
/ 09 ноября 2019

Как указано в комментариях, используйте sleep. Все, что было введено во время sleep, будет напечатано на терминале (как и для каждой команды, которая не использует stdin). Используйте stty, чтобы скрыть этот вывод.

  • stty -echo отключает вывод.
  • stty echo включает вывод (непечатные символы, скрытые до сих пор, будут напечатаны).

Вы, вероятно, хотите подождать только оставшееся время, а не дополнительные 0,05 секунды. Есть два способа сделать это:

Простой, но, возможно, ненадежный способ

Использовать sleep до read - таким образом, вам не нужно измерять время ожиданиявремя и не нужно вычислять оставшееся время:

stty -echo
sleep 0.049
read -n1 -s -t0.001 key;
stty echo;

echo "key was $key"

Время ожидания read -t… должно быть достаточно длинным, чтобы фактически прочитать буферизованные символы. Вы можете проверить это, скопировав очень длинную строку в ваш терминал - read будет читать только часть этого. На медленной системе вам, возможно, придется увеличить 0.001. Но имейте в виду, что совокупное время ожидания для пользователя может быть просто временем сна, то есть большее -t означает меньшую точность.

Сложный, но надежный способ

Обойтиэту проблему вы можете поставить sleep после read и вычислить оставшееся время ожидания, что, конечно, является дополнительной работой. Вот решение в bash 5.0 или выше:

# all variables of the form tSomething are in μs = 10^-6 s
stty -echo
tStart="${EPOCHREALTIME/./}" 
read -n1 -s -t0.05 key;
tEnd="${EPOCHREALTIME/./}"
printf -v tWait %07d "$((tStart + 50000 - tEnd))" # 50000 μs = 0.05 s
sleep "${tWait:: -6}.${tWait: -6}"
stty echo

echo "key was $key"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...