Ответы:
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
Press a key to continue...
то даже начинающие пользователи смогут найти a
ключ и нажать его; o)
command | myscript.sh
или myscript.sh | command
. Смотрите этот ответ для решения.
read: 1: read: Illegal option -n
обязательно включите вашу команду bash -c 'command && command'
и т. Д., Поскольку эта ошибка, вероятно, из sh
. Я делаю это в команде оболочки Ландо.
Я часто использую эти способы, которые очень короткие, и они похожи на решения @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 правильный ввод. Положить $? в переменную как можно скорее, если вам нужно проверить ее после некоторых команд, потому что все команды переписывают $?
-s
; man read
и read --help
помощь не помогла на Ubuntu 10.04.1 LTS. Редактировать: help read
сделал; остальное не рекомендуется?
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;
у меня работает вместо этого. `
-i
отлично работает на Ubuntu, также я не знаю, как, если -d
работает так же на OSX.
Это сработало для меня во многих разновидностях 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
status=none
тоже не портативно. Вместо этого перенаправьте stdout и stderr в / dev / null. read -r line < /dev/tty
будет прийти для печати ENTER ... .
settings=$(stty -g); stty raw; dd ...; stty "$settings"
сохранение и восстановление настроек tty.
tr
редактирование тоже может сработать?
tr
что буферизировал бы свой вывод как конвейер, а у неамериканских клавиатур есть клавиши, которые отправляют символы за пределы \1-\177
диапазона. dd
это идиоматический способ здесь.
Если вам просто нужно приостановить цикл или сценарий, и вы готовы нажать клавишу Enter вместо любой клавиши, тогда read
она сама сделает эту работу.
do_stuff
read
do_more_stuff
Это не удобно для конечного пользователя, но может быть достаточно в тех случаях, когда вы пишете быстрый скрипт для себя, и вам нужно приостановить его, чтобы сделать что-то вручную в фоновом режиме.
Попробуй это:
function pause(){
read -p "$*"
}
Эта функция работает как 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
для Великой Справедливости!
Да, для использования read
- и есть пара твиков, которые делают его наиболее полезным как cron
в терминале, так и в терминале.
Пример:
time rsync (options)
read -n 120 -p "Press 'Enter' to continue..." ; echo " "
Параметр -n 120 истекает через 2 минуты для оператора чтения, поэтому он не блокируется cron
.
В терминале это дает 2 минуты, чтобы увидеть, сколько времени rsync
потребовалось для выполнения команды.
Затем последующее echo
приглашение bash появится на следующей строке.
В противном случае он будет отображаться в той же строке сразу после «продолжить ...» при Enterнажатии на терминале.
"Enter any non-NUL character to continue"
. Некоторые ключи не отправляют никаких символов (например,Ctrl
...), а некоторые - более одного (напримерF1
,Home
...).bash
игнорирует NUL-символы