Як зупинити bash-скрипт, поки користувач не натисне Space?
Я хотів би, щоб це питання було в моєму сценарії
Натисніть пробіл, щоб продовжити, або CTRL+, Cщоб вийти
а потім сценарій повинен зупинитися і чекати, поки натисне пробіл.
Як зупинити bash-скрипт, поки користувач не натисне Space?
Я хотів би, щоб це питання було в моєму сценарії
Натисніть пробіл, щоб продовжити, або CTRL+, Cщоб вийти
а потім сценарій повинен зупинитися і чекати, поки натисне пробіл.
Відповіді:
Ви можете використовувати read
:
read -n1 -r -p "Press space to continue..." key
if [ "$key" = '' ]; then
# Space pressed, do something
# echo [$key] is empty when SPACE is pressed # uncomment to trace
else
# Anything else pressed, do whatever else.
# echo [$key] not empty
fi
read -n1 -rsp $'Press any key to continue or Ctrl+C to exit...\n'
else
Блок завжди працює, навіть коли натискається пробіл.
bash
. Він працює, якщо ви використовуєте read _
натомість, якщо у вас є інша оболонка, ніж bash
.
''
містити простір всередині?
''
для порожнього рядка. Всередині немає місця. Гадаю, це також підходить, якщо ви введете ENTER або TAB
Метод, обговорюваний у цій SO-Q&A, ймовірно, найкращий кандидат для альтернативи pause
поведінці, до якої ви звикли в Windows під час створення файлів BAT.
$ read -rsp $'Press any key to continue...\n' -n1 key
Тут я виконую вище, а потім просто натискаю будь-яку клавішу, в даному випадку Dклавішу.
$ read -rsp $'Press any key to continue...\n' -n1 key
Press any key to continue...
$
$
перед рядком -rsp $'Press
:?
echo -e "..."
рядків. Це набагато компактніше в тих ситуаціях.
hold=' '
printf "Press 'SPACE' to continue or 'CTRL+C' to exit : "
tty_state=$(stty -g)
stty -icanon
until [ -z "${hold#$in}" ] ; do
in=$(dd bs=1 count=1 </dev/tty 2>/dev/null)
done
stty "$tty_state"
Тепер він друкує підказку без зворотного нового рядка, обробляє CTRL+C
надійно, викликає stty
лише стільки разів, скільки необхідно, і відновлює керуючу tty саме в тому стані, в якому stty
його знайшли. Подивіться man stty
інформацію про те, як чітко керувати відгомонами, керувати символами та всім.
Ви також можете зробити це:
printf "Press any key to continue or 'CTRL+C' to exit : "
(tty_state=$(stty -g)
stty -icanon
LC_ALL=C dd bs=1 count=1 >/dev/null 2>&1
stty "$tty_state"
) </dev/tty
Ви можете це зробити ENTER
, без [
тестів ]
і stty
подібних:
sed -n q </dev/tty
Ви можете створити для нього функцію:
pause(){
read -n1 -rsp $'Press any key to continue or Ctrl+C to exit...\n'
}
Тоді ви можете використовувати це скрізь у своєму сценарії:
pause
Налаштування IFS
порожнього рядка пригнічує поведінку читання за замовчуванням обрізки білого простору.
try_this() {
echo -n "Press SPACE to continue or Ctrl+C to exit ... "
while true; do
# Set IFS to empty string so that read doesn't trim
# See http://mywiki.wooledge.org/BashFAQ/001#Trimming
IFS= read -n1 -r key
[[ $key == ' ' ]] && break
done
echo
echo "Continuing ..."
}
try_this
ОНОВЛЕННЯ 2018-05-23: Ми можемо спростити це за допомогою змінної REPLY, яка не підлягає розділенню слів:
try_this() {
echo -n "Press SPACE to continue or Ctrl+C to exit ... "
while true; do
read -n1 -r
[[ $REPLY == ' ' ]] && break
done
echo
echo "Continuing ..."
}
try_this
Ось спосіб, який працює і в 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
велику справедливість!