Execute comandos em um terminal, então deixe-me digitar mais comandos

3

Eu escrevi esse script para criar várias guias na mesma janela de terminal e executar comandos nelas:

#!/bin/bash
#Use the commands as:
#--tab-with-profile=Default --title=<SPECIFY THE TAB TITLE HERE> -e "bash -ic \"<SPECIFY THE COMMAND YOU WANT TO RUN HERE>; bash\"" \
#The ampersand in the end of this file makes sure that the gnome-terminal command is run as a background process

echo "Setting up simulator environment";
service mysqld start;

gnome-terminal \
  --tab-with-profile=Default --title=PROG1 -e "bash -ic \"clear;ls;./prog1; bash disown\"" \
  --tab-with-profile=Default --title=SIMULATOR -e "bash -ic \"clear;ls;./simulator; bash disown\"" \
  --tab-with-profile=Default --title=PROG2 -e "bash -ic \"clear;ls;./prog2; bash disown\"" \
  --tab-with-profile=Default --title=DATA -e "bash -ic \"./data -f \"/home/user/NetBeansProjects/data3.txt\" -p \"6785\"; bash disown\"" \
  --tab-with-profile=Default --title=PROG3 -e "bash -ic \"cd /home/user/NetBeansProjects/simulator;./prog3; bash disown\"" \
&

O problema é que, quando algum desses programas termina a execução ou se eu pressionar Ctrl+c para interromper qualquer um desses programas, a guia será fechada. Não quero que o separador seja fechado. Eu quero que a aba permaneça aberta e que o terminal bash seja mostrado para que eu possa executar algum outro comando na aba . Existe uma maneira de fazer isso acontecer?

    
por Nav 06.10.2015 / 13:37

1 resposta

4

Existem dois problemas;

O primeiro é que dentro de cada comando bash -ic (que por sinal não gera um shell interativo porque -c sobrescreve -i , então -i é seguro ser descartado) você está chamando bash disown em vez de bash , o que significa nada e imediatamente sai no erro; portanto, não há shell interativo em execução que mantenha gnome-terminal aberto no final do comando bash -c externo;

(Lembre-se também que você pode usar exec bash em vez de bash no final do comando para salvar alguns processos.)

O segundo é que Ctrl + C SIGINTs todos os processess no mesmo grupo do processo eliminado, incluindo o pai bash instância que é suposto a desova o shell interativo no final do comando;

Para corrigir isso, você pode usar bash trap integrado para definir bash para gerar outra instância bash interativa após a recepção de um sinal SIGINT.

Em suma, isso deve funcionar:

gnome-terminal \
  --tab-with-profile=Default --title=PROG1 -e "bash -c \"trap 'bash' 2; clear;ls;./prog1; exec bash\"" \
  --tab-with-profile=Default --title=SIMULATOR -e "bash -c \"trap 'bash' 2; clear;ls;./simulator; exec bash\"" \
  --tab-with-profile=Default --title=PROG2 -e "bash -c \"trap 'bash' 2; clear;ls;./prog2; exec bash\"" \
  --tab-with-profile=Default --title=DATA -e "bash -c \"trap 'bash' 2; ./data -f \"/home/user/NetBeansProjects/data3.txt\" -p \"6785\"; exec bash\"" \
  --tab-with-profile=Default --title=PROG3 -e "bash -c \"trap 'bash' 2; cd /home/user/NetBeansProjects/simulator;./prog3; exec bash\"" \
&
    
por 06.10.2015 / 14:02