Что 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.

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

function pause(){
   read -p "$*"
}
Другие вопросы по тегам