Ответ 1
вы можете использовать встроенную команду read
с опцией -t
и -n
while :
do
# TASK 1
date
read -t 1 -n 1 key
if [[ $key = q ]]
then
break
fi
done
# TASK 2
date +%s
Итак, я хочу написать bash script, которые представляют собой последовательность шагов и плохо идентифицируют ее как "задача №". Однако каждый шаг завершается и может выполняться до тех пор, пока пользователь хочет.
Do task1
if keypressed stop task1 and move on #this is the part I need help with. There can be up to 10 of these move on steps.
Do task2
...
кина, как верх; он продолжает делать вещи, пока вы не нажмете q до совершенно, однако, я хочу перейти к следующей вещи
вы можете использовать встроенную команду read
с опцией -t
и -n
while :
do
# TASK 1
date
read -t 1 -n 1 key
if [[ $key = q ]]
then
break
fi
done
# TASK 2
date +%s
отличное решение kev хорошо работает даже в Bash 3.x., но вводит 1-секундную задержку (-t 1
) в каждой итерации цикла.
В Bash 3.x наименьшее поддерживаемое значение для -t
(timeout), к сожалению, 1
(второе).
Bash 4.x поддерживает 0
и дробные значения, однако:
Решение, поддерживающее произвольный ключ q
, требует ненулевого значения -t
, но вы можете указать значение, очень близкое к 0
, чтобы свести к минимуму задержку
#!/bin/bash
# !! BASH 4.x+ ONLY
while :; do
# Loop command
date
# Check for 'q' keypress *waiting very briefly* and exit the loop, if found.
read -t 0.01 -rN 1 && [[ $REPLY == 'q' ]] && break
done
# Post-loop command
date +%s
Предостережение: в приведенном выше примере используется 0.01
как значение почти без тайм-аута, но в зависимости от вашей платформы хоста, программы терминала и, возможно, скорости/конфигурации ЦП, может потребоваться большее значение/меньшее значение может поддерживаться. Если значение слишком мало, вы увидите прерывистые ошибки error setting terminal attributes: Interrupted system call
- если кто-нибудь знает, почему, скажите нам.
Совет шляпы jarno за его помощь в следующем:
Использование -t 0
работает согласно help read
(выделено мной):
Если TIMEOUT равно 0, прочитайте немедленно, не пытаясь прочитать какие-либо данные, возврат успех, только если вход доступен по указанному файловый дескриптор.
По состоянию на Bash v4.4.12, -t 0
, кажется, игнорирует -n
/-n
, так что только нажатие клавиши ENTER (или последовательность нажатие клавиш ENTER) приводит к тому, что read
указывает, что данные доступны.
Если кто-нибудь знает, является ли это ошибкой или есть ли веские причины для такого поведения, сообщите нам.
Следовательно, только с ENTER, поскольку ключ выхода - это решение -t 0
, которое в настоящее время возможно:
#!/bin/bash
# !! BASH 4.x+ ONLY
while :; do
# Loop command
date
# Check for ENTER keypress and, after clearing the input buffer
# with a dummy `read`, exit the loop.
read -t 0 -r && { read -r; break; }
done
# Post-loop command
date +%s