Відповіді:
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
. Я роблю це в команді обгортки Lando.
Я дуже часто використовую ці способи, які є дуже короткими, і вони схожі на рішення @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 ' вказує escappe як розділову характеристику, тому в якості остаточного символу для поточного введення можна поставити будь-який символ, але будьте обережні, щоб ввести символ, який користувач може ввести.
-n 1 вказує, що йому потрібен лише один символ.
-e задає режим зчитування.
-i $ ' Y ' вказує Y як початковий текст у режимі читання.
-t 5 задає час очікування в 5 секунд
ключ служить у випадку, якщо вам потрібно знати вхід, у випадку -n1 - клавішу, яку натиснули.
$? служать, щоб знати вихідний код останньої програми, для читання, 142 у випадку таймауту, 0 правильного введення. Покласти $? у змінній якнайшвидше, якщо вам потрібно перевірити її після команд somes, тому що всі команди переписали б $?
-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.