Вопрос

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

Это было полезно?

Решение

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, но вдобавок с тайм-аутом и беззвучным режимом.

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

Команды

  • Введите решение

    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
    

Объяснение

указывает необработанный режим, в котором не допускается использование комбинированных символов, таких как «\" или «^».

указывает беззвучный режим, а также потому, что нам не нужен вывод с клавиатуры.

-p $'быстрый' указывает приглашение, которое должно находиться между $' и ', чтобы можно было использовать пробелы и экранированные символы.Будьте осторожны: вы должны ставить между одинарными кавычками символ доллара, чтобы использовать экранированные символы, в противном случае вы можете использовать простые кавычки.

-д $'\ е' указывает escappe в качестве символа-разделителя, поэтому в качестве последнего символа для текущей записи можно использовать любой символ, но будьте осторожны, помещая символ, который может ввести пользователь.

1 указывает, что ему нужен только один символ.

указывает режим строки чтения.

-я $'Да' указывает Y в качестве исходного текста в режиме чтения.

5 задает таймаут 5 секунд

ключ служит в том случае, если вам нужно знать ввод, в случае -n1 - нажатую клавишу.

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

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

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

echo Press enter to continue; read dummy;

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

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

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

do_stuff
read
do_more_stuff

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

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

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

function pause(){
   read -p "$*"
}

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

Пример:

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top