У меня есть оболочка Bash script, в которой я хотел бы приостановить выполнение до тех пор, пока пользователь не нажмет клавишу. В DOS это легко выполнить с помощью команды "пауза". Есть ли эквивалент Linux, который я могу использовать в моем script?
Что эквивалентно Linux для приостановки DOS?
Ответ 1
read
делает следующее:
[email protected]:~$ read -n1 -r -p "Press any key to continue..." key
[...]
[email protected]:~$
-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
Ответ 2
Я использую эти способы, которые очень короткие, и они похожи на @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 указывает режим raw, который не позволяет использовать комбинированные символы типа "\" или "^".
-s указывает режим молчания и потому, что нам не нужен вывод на клавиатуре.
-p $'prompt' указывает приглашение, которое должно быть между $'и', чтобы пропускать пробелы и экранированные символы. Будьте осторожны, вы должны поставить между одинарными кавычками символ доллара, чтобы воспользоваться экранированными символами, иначе вы можете использовать простые кавычки.
-d $'\ e' указывает escappe как разделитель charater, так как последний символ для текущей записи, это можно поместить любого символа, но будьте осторожны, чтобы поместить символ, который пользователь может тип.
-n 1 указывает, что ему нужен только один символ.
-e указывает режим чтения.
-i $'Y' указывает Y как исходный текст в режиме чтения.
-t 5 указывает время ожидания 5 секунд
ключ служит, если вам нужно знать ввод, в случае -n1, нажав клавишу.
$?, чтобы узнать код выхода последней программы, для чтения, 142 в случае таймаута, 0 правильный ввод. Положить $? в переменной как можно скорее, если вам нужно проверить ее после команд somes, потому что все команды будут переписывать $?
Ответ 3
read
без каких-либо параметров будет продолжаться, только если вы нажмете enter.
Команда DOS pause
будет продолжена, если вы нажмете любую клавишу. Используйте read –n1
, если вы хотите этого поведения.
Ответ 4
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
Ответ 5
Это работало для меня во многих вариантах Linux, где некоторые из этих других решений не были (в том числе и самые популярные). Я думаю, что это более читаемо тоже...
echo Press enter to continue; read dummy;
Обратите внимание, что переменная должна быть представлена как аргумент read
.
Ответ 6
Если вам просто нужно приостановить цикл или script, и вы счастливы нажать Enter вместо любой клавиши, тогда read
самостоятельно выполнит задание.
Ответ 7
Попробуйте следующее:
function pause(){
read -p "$*"
}