Как указано в комментариях, используйте 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"