Bash - pausa e retoma um script (for-loop) com determinada chave

2

Estou usando a seguinte funcionalidade de contador em um script:

for ((i=1; i <= 100; i++ )); do
    printf "\r%s - %s" "$i" $(( 100 - i ))
    sleep 0.25
done

existe uma maneira de pausar e retomar o contador com a entrada do teclado?
(preferencialmente com a mesma chave - digamos com espaço )

    
por nath 11.01.2018 / 23:22

1 resposta

3

Use read com um tempo limite -t e defina uma variável com base em sua saída.

#!/bin/bash

running=true

for ((i=1; i <= 100; i++ )); do
    if [[ "$running" == "true" ]]; then
        printf "\r%s - %s" "$i" $(( 100 - i ))
    fi

    if read -sn 1 -t 0.25; then
        if [[ "$running" == "true" ]]; then
            running=false
        else 
            running=true
        fi
    fi
done

Com isso, você pode pressionar qualquer tecla para pausar ou cancelar a pauta do script.

running armazena true ou false para informar se queremos que o loop funcione ou agora. read -sn 1 -t 0.25 é a chave, lê um caractere -n1 , suprime pressionamentos de tecla -s e aguarda apenas 0,25s -t 0.25 . Se read expirar, ele retornará um status de saída nenhum 0, que detectamos com o if e somente se uma tecla foi pressionada, alternamos o status de execução.

Você também pode atribuir o caractere de leitura a uma variável e verificar um caractere específico para limitá-lo a apenas uma chave.

    if read -sn 1 -t 0.25 key && [[ "$key" = "s" ]] ; then

Use "$key" == "" se você quiser verificar o espaço ou entrar.

Observe que um dos efeitos colaterais do tempo limite de leitura + é que, se você pressionar uma tecla, o próximo loop será executado mais rapidamente que o normal, o que se torna mais óbvio se você pressionar uma tecla.

Uma alternativa pode ser usar o controle de fluxo de trabalho. ctrl + s suspenderá um terminal e ctrl + q o retomará. Isso bloqueia todo o shell e não funciona em todos os shells. Você pode usar ctrl + z para suspender um processo, dando-lhe um prompt de volta e usar fg para retomar o processo novamente, o que lhe permite continuar usando o shell.

    
por 12.01.2018 / 00:22