Что Linux эквивалентно паузе DOS?

171

У меня есть оболочка Bash script, в которой я хотел бы приостановить выполнение до тех пор, пока пользователь не нажмет клавишу. В DOS это легко выполнить с помощью команды "пауза". Есть ли эквивалент Linux, который я могу использовать в моем script?

  • 1
    Как круто. Это было опубликовано 8+ лет назад и попало в мой поиск Google в апреле 2018 года. T
Теги:

7 ответов

242
Лучший ответ

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
  • 4
    Строго говоря, это будет "Enter any non-NUL character to continue" . Некоторые клавиши не отправляют никаких символов (например, Ctrl ...), а некоторые - более одного (например, F1 , Home ...). bash игнорирует NUL символов.
  • 0
    Обычно лучше спросить конкретный ключ, такой как ввод, пробел или Y. «ЛЮБОЙ» может вводить в заблуждение некоторых пользователей, есть клавиша TAB, так почему нет ЛЮБОГО ключа и наверняка есть ключи, которые потенциально опасны как ESCAPE, CTRL, CMD, кнопка питания и т. д. Это уже не так актуально сегодня, потому что в настоящее время консоль обычно используется только опытными пользователями компьютеров, которые будут правильно интерпретировать «ЛЮБУЮ клавишу». В Apple 2 Design Manual, довольно старой, есть интересный раздел, посвященный этой теме ( apple2scans.net/files/1982-A2F2116-m-a2e-aiiedg.pdf ).
Показать ещё 2 комментария
121

Я использую эти способы, которые очень короткие, и они похожи на @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, потому что все команды будут переписывать $?

  • 0
    +1 для объяснения -s ; man read and read --help help не помогло в Ubuntu 10.04.1 LTS. Редактировать: help read сделал; остальное не рекомендуется?
  • 1
    1+ за отличное объяснение: но я read: -i: invalid option для бывших. read -rp $'Are you sure (Y/n) : ' -ei $'Y' key; на #osx read -rp $'kill-server: Are you sure (Y/n) : ' -d $'Y' key; у меня работает вместо `
Показать ещё 2 комментария
12

read без каких-либо параметров будет продолжаться, только если вы нажмете enter. Команда DOS pause будет продолжена, если вы нажмете любую клавишу. Используйте read –n1, если вы хотите этого поведения.

8

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
  • 1
    status=none не является переносимым. Вместо этого перенаправьте stdout и stderr в / dev / null. read -r line < /dev/tty будет достаточной для нажатия ENTER ....
  • 0
    @StephaneChezales спасибо - я этого не знал. сейчас исправлю. Еще раз спасибо - исправлено. Кстати, ты бездонный источник полезной информации.
Показать ещё 8 комментариев
6

Это работало для меня во многих вариантах Linux, где некоторые из этих других решений не были (в том числе и самые популярные). Я думаю, что это более читаемо тоже...

echo Press enter to continue; read dummy;

Обратите внимание, что переменная должна быть представлена ​​как аргумент read.

  • 5
    Опубликовано 8 лет назад. В июле 2017 года это то, что я хотел. Большое спасибо.
  • 0
    этот ответ решит мою проблему, если я скопирую и вставлю эту строку и по какой-то причине добавлю больше строк, добавленные строки не будут выполнены, как это было с паузой в DOS
1

Если вам просто нужно приостановить цикл или script, и вы счастливы нажать Enter вместо любой клавиши, тогда read самостоятельно выполнит задание.

  • 0
    Это правда, но для базы данных наиболее полезно показать пример.
  • 0
    Спасибо, я принял ваш совет на борт. Просто задание имени команды не очень понятно задним числом.
-3

Попробуйте следующее:

function pause(){
   read -p "$*"
}
  • 0
    Может кто-нибудь объяснить, почему это понизили? Это из-за отсутствия контента или это плохое решение?
  • 4
    @ 3ocene Это не показывает использование созданной функции; плюс этому не хватает объяснения.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню