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
"Enter any non-NUL character to continue"
. Некоторые ключи не отправляют никаких символов (например,Ctrl
...), а некоторые - более одного (напримерF1
,Home
...).bash
игнорирует NUL-символы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.
команды
Введите решение
Escape-решение (с -d $ '\ e')
Любое ключевое решение (с -n 1)
Вопрос с предварительно выбранным выбором (с -ei $ 'Y')
Решение по тайм-ауту (с -t 5)
Сон улучшенный псевдоним
объяснение
-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;
на #osxread -rp $'kill-server: Are you sure (Y/n) : ' -d $'Y' key;
у меня работает вместо этого. `-i
отлично работает на Ubuntu, также я не знаю, как, если-d
работает так же на OSX.read
без каких-либо параметров будет продолжаться только при нажатии Enter. Команда DOSpause
продолжится, если вы нажмете любую клавишу. Используйте,read –n1
если вы хотите это поведение.источник
Это сработало для меня во многих разновидностях Linux, где некоторые из этих других решений не (в том числе самые популярные здесь). Я думаю, что это также более читабельно ...
Обратите внимание, что переменная должна быть указана в качестве аргумента
read
.источник
read -n1
не является портативным Портативный способ сделать то же самое может быть:Помимо использования
read
, просто нажмитеENTER
для продолжения запроса, вы можете сделать:источник
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
она сама сделает эту работу.Это не удобно для конечного пользователя, но может быть достаточно в тех случаях, когда вы пишете быстрый скрипт для себя, и вам нужно приостановить его, чтобы сделать что-то вручную в фоновом режиме.
источник
Попробуй это:
источник
Эта функция работает как
bash
иzsh
, так и обеспечивает ввод / вывод на терминал:Поместите это
.{ba,z}shrc
для Великой Справедливости!источник
Да, для использования
read
- и есть пара твиков, которые делают его наиболее полезным какcron
в терминале, так и в терминале.Пример:
Параметр -n 120 истекает через 2 минуты для оператора чтения, поэтому он не блокируется
cron
.В терминале это дает 2 минуты, чтобы увидеть, сколько времени
rsync
потребовалось для выполнения команды.Затем последующее
echo
приглашение bash появится на следующей строке.В противном случае он будет отображаться в той же строке сразу после «продолжить ...» при Enterнажатии на терминале.
источник