Eu uso um método que tem algumas semelhanças com a resposta de terdon (e foi criado com alguma ajuda dele - Obrigado @terdon por isso!), mas tem uma abordagem um pouco diferente:
Eu crio um arquivo temporário para que o terminal filho possa se comunicar com o terminal pai e informar o PID de sua instância bash correspondente. Então deixo o terminal pai ler o arquivo temporário e lembro do PID, excluo o arquivo e continuo verificando a cada 100ms (o atraso pode ser alterado) se a instância do bash do terminal filho ainda está em execução. Caso contrário, o terminal foi fechado manualmente ou porque o comando foi concluído. Em seguida, o comando de inicialização termina e o terminal pai é utilizável novamente.
Vantagem dessa abordagem:
Todos os comandos que serão lançados ( ls; sleep 3
ou qualquer substituto para aqueles) são executados após o comando que é responsável por permitir a detecção do fechamento do terminal. Portanto, se o comando interno trava ou você fecha o terminal manualmente antes de terminar, o mecanismo ainda está funcionando e continuará a execução do script externo em vez de executar em loops infinitos.
O código como one-liner com saída de depuração ("lançado" depois que a janela do terminal filho foi aberta, "terminado" depois que foi fechado) e a precisão de 0.1 segundos é:
pidfile=$(mktemp); gnome-terminal -x bash -c "echo $$>$pidfile; ls; sleep 3"; until [ -s $pidfile ]; do sleep 0.1; done; terminalpid=$(cat "$pidfile"); rm $pidfile; echo "launched"; while ps -p $terminalpid > /dev/null 2>&1; do sleep 0.1; done; echo "terminated"
Ou sem saída de depuração:
pidfile=$(mktemp); gnome-terminal -x bash -c "echo $$>$pidfile; ls; sleep 3"; until [ -s $pidfile ]; do sleep 0.1; done; terminalpid=$(cat "$pidfile"); rm $pidfile; while ps -p $terminalpid > /dev/null 2>&1; do sleep 0.1; done
Quase o mesmo código, mas com mais flexibilidade, escrito como script bash:
#! /bin/bash
delay=0.1
pidfile=$(mktemp)
gnome-terminal -x bash -c "echo $$>$pidfile; ls; sleep 3"
until [ -s $pidfile ]
do sleep $delay
done
terminalpid=$(cat "$pidfile")
rm $pidfile
echo "launched"
while ps -p $terminalpid > /dev/null 2>&1
do sleep $delay
done
echo "terminated"
Você pode omitir as linhas echo "launched"
e echo "terminated"
, claro, assim como você pode alterar a linha delay=0.1
para outro atraso entre duas verificações do estado do terminal (em segundos) se você precisar que seja mais ou menos preciso.
Para executar outro comando personalizado no terminal filho, substitua a linha
gnome-terminal -x bash -c "echo $$>$pidfile; ls; sleep 3"
com o seguinte (insira seu comando em vez do marcador de posição maiúsculo!)
gnome-terminal -x bash -c "echo $$>$pidfile; INSERTYOURCOMMANDSHERE"