função BASH para ler a entrada do usuário OU interromper no tempo limite

4

Eu estou tentando escrever uma função BASH que fará x se o programa a ou b terminar.

exemplo:

echomessage()
{
echo "here's your message"
if [[sleep 3 || read -p "$*"]]
then
   clear
fi
}

Nesse cenário:

a = ' sleep 3 ', que deve rodar x depois de 3 segundos

b = ' read -p "$*" ', que deve rodar x ao fornecer qualquer entrada de teclado.

x = ' clear ', que limpa a saída de eco se o programa atingir o tempo limite ou se o usuário pressionar uma tecla no teclado.

    
por Jay Holister 19.03.2015 / 21:18

1 resposta

10

read tem um parâmetro para o tempo limite, você pode usar:

read -t 3 answer

Se você quiser que read espere por um único caractere (linha inteira + Enter é o padrão), você pode limitar a entrada para 1 caractere:

read -t 3 -n 1 answer

Após a entrada correta, o valor de retorno será 0, então você pode verificar isso da seguinte forma:

if [ $? == 0 ]; then
    echo "Your answer is: $answer"
else
    echo "Can't wait anymore!"
fi

Eu acho que não há necessidade de implementar trabalhos em segundo plano na sua situação, mas se você quiser, aqui está um exemplo:

#!/bin/bash

function ProcessA() {
    sleep 1  # do some thing
    echo 'A is done'
}

function ProcessB() {
    sleep 2  # do some other thing
    echo 'B is done'
}

echo "Starting background jobs..."

ProcessA &  # spawn process "A"
pid_a=$!    # get its PID

ProcessB &  # spawn process "B"
pid_b=$!    # get its PID too

echo "Waiting... ($pid_a, $pid_b)"
wait  # wait for all children to finish

echo 'All done.'
    
por 19.03.2015 / 21:42

Tags