Bash script прослушать нажатие клавиши для перехода

Итак, я хочу написать 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 до совершенно, однако, я хочу перейти к следующей вещи

Ответы

Ответ 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

Ответ 2

отличное решение 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