Что Linux эквивалентно паузе DOS?
У меня есть сценарий оболочки Bash, в котором я хотел бы приостановить выполнение, пока пользователь не нажмет клавишу. В DOS это легко сделать с помощью команды "пауза". Есть ли эквивалент Linux, который я могу использовать в своем сценарии?
11 ответов
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, но с дополнительным тайм-аутом и бесшумным режимом.
Мне особенно нравится последний случай, и я использую его во многих скриптах, которые запускаются в цикле, пока пользователь не нажмет Enter.
команды
Введите решение
read -rsp $'Press enter to continue...\n'
Escape-решение (с -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' определяет escappe в качестве символа-разделителя, поэтому в качестве последнего символа для текущей записи можно использовать любой символ, но будьте осторожны с символом, который может ввести пользователь.
-n 1 указывает, что ему нужен только один символ.
-e указывает режим чтения.
-i $ 'Y' указывает Y как исходный текст в режиме чтения строки.
-t 5 указывает время ожидания 5 секунд
Клавиша служит, если вам нужно знать ввод, в -n1 случае - нажатую клавишу.
$? служит для того, чтобы узнать код завершения последней программы, для чтения, 142 в случае таймаута, 0 правильный ввод. Положить $? в переменную как можно скорее, если вам нужно проверить ее после некоторых команд, потому что все команды переписывают $?
Это сработало для меня во многих разновидностях Linux, в отличие от некоторых других решений (в том числе самых популярных здесь). Я думаю, что это тоже более читабельно...
echo Press enter to continue; read dummy;
Обратите внимание, что переменная должна быть указана в качестве аргумента read
,
read
без каких-либо параметров будет продолжаться только при нажатии Enter. DOS pause
Команда продолжится, если вы нажмете любую клавишу. использование read –n1
если вы хотите это поведение.
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
Эта функция работает в обоих 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
за великое правосудие!
Если вам просто нужно приостановить цикл или скрипт, и вы счастливы нажать Enter вместо любой клавиши, тогда read
сам по себе сделает работу.
do_stuff
read
do_more_stuff
Это не удобно для конечного пользователя, но может быть достаточно в тех случаях, когда вы пишете быстрый скрипт для себя, и вам нужно приостановить его, чтобы сделать что-то вручную в фоновом режиме.
Это исправляет, поэтому нажатие любой клавиши, кроме ENTER, все равно приведет к переходу на новую строку.
read -n1 -r -s -p "Press any key to continue..." ; echo
это лучше, чем пауза в окнах, потому что вы можете изменить текст, чтобы сделать его более полезным
read -n1 -r -s -p "Press any key to continue... (cant find the ANY key? press ENTER) " ; echo
Да для использования read
- и есть пара твиков, которые делают его наиболее полезным в обоих cron
и в терминале.
Пример:
time rsync (options)
read -n 120 -p "Press 'Enter' to continue..." ; echo " "
-N 120 истекает через 2 минуты для оператора read, поэтому он не блокируется cron
,
В терминале это дает 2 минуты, чтобы увидеть, как долго rsync
Команду потребовалось выполнить.
Тогда последующее echo
Это означает, что последующее приглашение bash появится на следующей строке.
В противном случае он будет отображаться в той же строке сразу после "продолжить..." при нажатии Enter на терминале.
Я создал небольшую программу для выполнения команд в Linux. Я загрузил код в свой репозиторий GitHub .
Чтобы установить его,
git clone https://github.com/savvysiddharth/pause-command.git
cd pause-command
sudo make install
Теперь, когда это установлено, вы можете использовать
pause
команда аналогична той, что вы делали в Windows.
Он также поддерживает необязательную пользовательскую строку, например
read
.
Пример:
pause "Pausing execution, Human intervention required..."
Используя это, программы C/C++, использующие такие операторы, как
system("pause");
теперь совместимы с Linux.