Что такое пауза в Linux в Linux?
Вопрос
У меня есть сценарий оболочки Bash, в котором я хотел бы приостановить выполнение, пока пользователь не нажмет клавишу.В DOS это легко сделать с помощью команды «пауза».Есть ли эквивалент Linux, который я могу использовать в своем сценарии?
Решение
read
Означает ли это:
user@host:~$ read -n1 -r -p "Press any key to continue..." key
[...]
user@host:~$
А -n1
указывает, что он ожидает только один символ.А -r
переводит его в необработанный режим, что необходимо, потому что в противном случае, если вы нажмете что-то вроде обратной косой черты, он не зарегистрируется, пока вы не нажмете следующую клавишу.А -p
указывает приглашение, которое необходимо заключить в кавычки, если оно содержит пробелы.А key
Аргумент необходим только в том случае, если вы хотите узнать, какую клавишу они нажали, и в этом случае вы можете получить к нему доступ через $key
.
Если вы используете Bash, вы также можете указать тайм-аут с помощью -t
, что приводит к тому, что чтение возвращает ошибку, если клавиша не нажата.Так, например:
read -t5 -n1 -r -p 'Press any key in the next five seconds...' key
if [ "$?" -eq "0" ]; then
echo 'A key was pressed.'
else
echo 'No key was pressed.'
fi
Другие советы
Я часто использую эти очень короткие способы, похожие на решения @theunamedguy и @Jim, но вдобавок с тайм-аутом и беззвучным режимом.
Мне особенно нравится последний случай, и я использую его во многих скриптах, которые выполняются в цикле, пока пользователь не нажмет Входить.
Команды
Введите решение
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
Объяснение
-р указывает необработанный режим, в котором не допускается использование комбинированных символов, таких как «\" или «^».
-с указывает беззвучный режим, а также потому, что нам не нужен вывод с клавиатуры.
-p $'быстрый' указывает приглашение, которое должно находиться между $' и ', чтобы можно было использовать пробелы и экранированные символы.Будьте осторожны: вы должны ставить между одинарными кавычками символ доллара, чтобы использовать экранированные символы, в противном случае вы можете использовать простые кавычки.
-д $'\ е' указывает escappe в качестве символа-разделителя, поэтому в качестве последнего символа для текущей записи можно использовать любой символ, но будьте осторожны, помещая символ, который может ввести пользователь.
-н 1 указывает, что ему нужен только один символ.
-е указывает режим строки чтения.
-я $'Да' указывает Y в качестве исходного текста в режиме чтения.
-т 5 задает таймаут 5 секунд
ключ служит в том случае, если вам нужно знать ввод, в случае -n1 - нажатую клавишу.
$? служат для того, чтобы узнать код выхода последней программы, для чтения, 142 в случае тайм-аута, 0 правильный ввод.Поставить $?в переменную как можно скорее, если вам нужно проверить ее после некоторых команд, потому что все команды перезапишут $?
read
без каких-либо параметров продолжится, только если вы нажмете Enter.ДОС pause
Команда продолжится, если вы нажмете любую клавишу.Использовать read –n1
если вы хотите такого поведения.
У меня это сработало на нескольких версиях Linux, а на некоторых других решениях — нет (включая самые популярные здесь).Я тоже думаю, что это более читабельно...
echo Press enter to continue; read dummy;
Обратите внимание, что переменная должна быть указана в качестве аргумента для read
.
read -n1
не является портативным.Портативный способ сделать то же самое может быть:
( trap "stty $(stty -g;stty -icanon)" EXIT
LC_ALL=C dd bs=1 count=1 >/dev/null 2>&1
) </dev/tty
Помимо использования read
, всего за прессу ENTER
чтобы продолжить подсказку, вы можете сделать:
sed -n q </dev/tty
Если вам просто нужно приостановить цикл или сценарий, и вы готовы нажать Enter вместо любой клавиши, тогда read
сам сделает всю работу.
do_stuff
read
do_more_stuff
Это не удобно для конечного пользователя, но может быть достаточно в тех случаях, когда вы пишете быстрый сценарий для себя и вам нужно приостановить его, чтобы сделать что-то вручную в фоновом режиме.
Эта функция работает в обоих bash
и zsh
, и обеспечивает ввод-вывод на терминал:
# Prompt for a keypress to continue. Customise prompt with $*
function pause {
>/dev/tty printf '%s' "${*:-Press any key to continue... }"
[[ $ZSH_VERSION ]] && read -krs # Use -u0 to read from STDIN
[[ $BASH_VERSION ]] && </dev/tty read -rsn1
printf '\n'
}
export_function pause
Поместите это в свой .{ba,z}shrc
за Великую Справедливость!
Попробуй это:
function pause(){
read -p "$*"
}
Да, чтобы использовать read
- и есть пара настроек, которые делают его наиболее полезным в обоих случаях. cron
и в терминале.
Пример:
time rsync (options)
read -n 120 -p "Press 'Enter' to continue..." ; echo " "
-n 120 делает тайм-аут оператора чтения через 2 минуты, поэтому он не блокируется. cron
.
В терминале дается 2 минуты, чтобы увидеть, как долго rsync
команда приступила к выполнению.
Затем последующие echo
это значит, что последующее приглашение bash появится на следующей строке.
В противном случае оно будет отображаться в той же строке сразу после «продолжить...», когда Входить нажимается в терминале.