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
.