Inicie o novo terminal gnome com várias abas e aguarde o comando ser executado

3

Eu quero iniciar uma nova janela do terminal gnome com algum comando em várias guias. Com base nesta questão :

gnome-terminal --tab -t "FOO" -e "/bin/zsh -i -c 'cd $(pwd); zsh -i'" \
               --tab -t "XYZ" -e "/bin/zsh -i -c 'cd $(pwd); tail -f /var/log/dmesg; zsh -i'"

O problema que estou enfrentando é que depois que eu CTRL-C a aba tail -f de bloqueio simplesmente sai e desaparece. No entanto, eu gostaria que ele permanecesse aberto e possivelmente inspecionasse a saída passada.

De alguma forma, meu palpite é que alguns pais pegam o SIGINT e fecham tudo em vez de enviá-lo para o comando tail .

Por exemplo, um simples sleep funciona bem:

gnome-terminal --tab -t "FOO" -e "/bin/zsh -i -c 'cd $(pwd); zsh -i'" \
               --tab -t "XYZ" -e "/bin/zsh -i -c 'cd $(pwd); sleep 3; zsh -i'"

Isso manterá as duas guias abertas com um aviso.

    
por ClojureMostly 26.08.2015 / 18:26

1 resposta

2

Use zsh construído em trap (o trap construído também está presente em bash ):

gnome-terminal --tab -t "FOO" -e "zsh" \
--tab -t "XYZ" -e "zsh -c 'trap \"zsh\" 2; tail -f /var/log/dmesg'"

Ou:

gnome-terminal --tab -t "FOO" -e "zsh" \
--tab -t "XYZ" -e "zsh -c 'trap \"zsh\" SIGINT; tail -f /var/log/dmesg'"

Parece que você está executando isso em sh . Algumas notas secundárias:

  • zsh em sua instalação já está em /bin (portanto, em path ), então tudo que você precisa para gerar um zsh shell é zsh ;
  • zsh é executado interativamente por padrão, então provavelmente tudo que você precisa para gerar um zsh shell interativo é rodar zsh ;
  • zsh é inteligente o suficiente para ler pwd por padrão, então provavelmente tudo que você precisa para gerar um zsh shell interativo no mesmo diretório de trabalho de sua sh instance é executar zsh ;

O problema, como você pensou, é o sinal SIGINT, que é propagado para todos os processos no mesmo grupo de processos do processo que recebe o sinal.

Usando trap 'zsh' 2 / trap 'zsh' SIGINT , a instância atual de zsh está definida para gerar outra instância de zsh após a recepção de um sinal SIGINT, o que contorna o problema.

Você também pode tornar a instância zsh "imune" a vários sinais, listando-os separados por espaços nos argumentos:

trap 'zsh' 1 2 3 [...]

Ou:

trap 'zsh' SIGHUP SIGINT SIGQUIT [...]

Você pode imprimir uma lista ordenada de todos os sinais disponíveis executando kill -l :

% kill -l
HUP INT QUIT ILL TRAP ABRT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH POLL PWR SYS
    
por kos 26.08.2015 / 21:40