Я часто использую эти способы, которые очень короткие, и они похожи на решения @theunamedguy и @Jim, но с дополнительным таймаутом и бесшумным режимом.
Мне особенно нравится последний случай, и я использую его во многих скриптах, которые запускаются в цикле, пока пользователь не нажмет Enter .
Команда
Введите решение
read -rsp $'Press enter to continue...\n'
Выходное решение (с -d $ '\ e')
read -rsp $'Press escape to continue...\n' -d $'\e'
Любое ключевое решение (с -n 1)
read -rsp $'Press any key to continue...\n' -n 1 key
# echo $key
Вопрос с предварительно выбранным выбором (с -ei $ 'Y')
read -rp $'Are you sure (Y/n) : ' -ei $'Y' key;
# echo $key
Время ожидания решения (с -t 5)
read -rsp $'Press any key or wait 5 seconds to continue...\n' -n 1 -t 5;
псевдоним улучшенного сна
read -rst 0.5; timeout=$?
# echo $timeout
Объяснение
-r указывает необработанный режим, который не допускает использование комбинированных символов, таких как "\" или "^".
-s определяет режим без вывода сообщений, и поскольку нам не нужен вывод с клавиатуры.
-p $ ' prompt ' указывает приглашение, которое должно быть между $ и $, чтобы разрешить пробелы и экранированные символы. Будьте осторожны, вы должны ставить между одинарными кавычками символ доллара, чтобы использовать экранированные символы, в противном случае вы можете использовать простые кавычки.
-d $ ' \ e ' задает escape-символ как символ-разделитель, поэтому в качестве последнего символа для текущей записи можно поставить любой символ, но будьте осторожны и символ, который может ввести пользователь.
-n 1 указывает, что ему нужен только один символ.
-e указывает режим чтения.
-i $ ' Y ' указывает Y в качестве исходного текста в режиме чтения строки.
-t 5 указывает время ожидания 5 секунд
клавиша служит в случае, если вам нужно знать ввод, в случае -n1, нажатую клавишу.
$? служит для определения кода завершения последней программы, для чтения, 142 в случае тайм-аута, 0 правильного ввода. Положить $? в переменную как можно скорее, если вам нужно проверить ее после некоторых команд, потому что все команды переписывают $?