Відповіді:
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.