Escutar a entrada do usuário sem esperar para fazer outros processos

1

Ok, então eu tenho um script simples que tem a estrutura abaixo. Eu tenho este subprocesso que será executado por um período indefinido de tempo. A partir de agora, só parará quando o usuário matar o processo manualmente. Eu queria saber se há uma maneira de ouvir a entrada do usuário sem ficar preso em uma linha read . Em outras palavras, enquanto o subprocesso está sendo executado, em segundo plano, veja se o usuário digita "quit \n " no terminal.

...

if [[ option = "3" ]]; then
    while [2 -lt 4]; #THIS IS WHERE I WANT TO CHANGE TO LISTENING FOR INPUT TO QUIT
        #Some sub process that continues to run
    done
fi

....

Obrigado pela ajuda! Desculpe se isso está mal formulado, não consegui pensar em uma maneira melhor de descrever o problema. Quanto às minhas tentativas de brainstorming, eu sei que é possível usar uma variável na condição while e dizer isso até que seja igual a "quit", mas definir essa variável para a entrada é onde me perco.

    
por Colin F. 07.09.2016 / 15:12

1 resposta

1

Você pode executar seu processo em segundo plano (com & ) e, em seguida, executar um read do usuário em segundo plano e aguardar a conclusão de um deles. Você acaba com algo parecido com

mylongrunningcommand &
pid1=$!
echo "enter quit to stop"
while read reply && [ quit != "$reply" ]
do  :
done </dev/stdin &
pid2=$!
wait -n
echo "got quit or command done"
kill -9 $pid1 $pid2
wait

O read está dentro de um loop para que você possa ter várias tentativas ao digitar "quit". Ele precisa ter stdin redirecionado para ele devido à experiência. O wait -n retorna quando o trabalho em segundo plano é concluído e o kill mata os IDs do processo de ambos os trabalhos, pois não sabemos o que acabou.

O acima produz algumas mensagens do bash sobre os processos sendo mortos. Se você quiser suprimir estes substitua as últimas 2 linhas com

exec 3>&2 2>/dev/null
kill -9 $pid1 $pid2
wait
exec 2>&3 3>&-

Isso move temporariamente o stderr para /dev/null .

    
por 07.09.2016 / 19:52