Eu encontrei uma solução. Basicamente, você executa o loop de atualização em segundo plano e tem o loop principal em primeiro plano. Eles podem se comunicar uns com os outros usando comandos trap / kill.
Enviei um arquivo .sh para o github para dar um exemplo completo.
Aqui está um resumo modificado de como isso funciona:
Nota: você tem que usar ctrl-c para escapar.
#!/bin/bash
update()
{
trap "move_left;" $LEFT
trap "move_right;" $RIGHT
while true; do
#output whatever needed
done
}
read_in()
{
trap "return;" SIGINT SIGQUIT
while true; do
read -s -n 1 key
case key in
C) kill -$RIGHT $game_pid ;;
D) kill -$LEFT $game_pid ;;
esac
done
}
move_left()
{
#update position variable
}
move_right()
{
#update position variable
}
update &
game_pid=$!
read_in
kill -9 $game_pid
Use o script de exemplo vinculado acima para uma versão de exemplo de trabalho, mas você o tem! Apenas fiz uma pequena reformulação da arquitetura do programa.