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

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

219 голосов
/ 18 сентября 2008

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

Ответы [ 9 ]

312 голосов
/ 18 сентября 2008

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
146 голосов
/ 22 июля 2013

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

14 голосов
/ 18 января 2017

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

echo Press enter to continue; read dummy;

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

13 голосов
/ 18 сентября 2008

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

8 голосов
/ 05 июня 2014

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
2 голосов
/ 22 сентября 2016

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

do_stuff
read
do_more_stuff

Это не удобно для конечного пользователя, но может быть достаточно в тех случаях, когда вы пишете быстрый скрипт для себя, и вам нужно приостановить его, чтобы сделать что-то вручную в фоновом режиме.

1 голос
/ 28 июня 2018

Эта функция работает как в 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 для Великого правосудия!

0 голосов
/ 04 апреля 2018

Да, для использования read - и есть пара настроек, которые делают его наиболее полезным как в cron, так и в терминале.

Пример:

time rsync (options)
read -n 120 -p "Press 'Enter' to continue..." ; echo " "

Параметр -n 120 истекает через 2 минуты для оператора чтения, поэтому он не блокируется в cron.

В терминале это дает 2 минуты, чтобы увидеть, сколько времени потребовалось для выполнения команды rsync.

Тогда последующий echo означает, что последующее приглашение bash появится на следующей строке.

В противном случае он будет отображаться в той же строке сразу после «продолжить ...», когда на терминале нажата Enter .

0 голосов
/ 18 сентября 2008

Попробуйте это:

function pause(){
   read -p "$*"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...