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, empath
), então tudo que você precisa para gerar umzsh
shell ézsh
; -
zsh
é executado interativamente por padrão, então provavelmente tudo que você precisa para gerar umzsh
shell interativo é rodarzsh
; -
zsh
é inteligente o suficiente para lerpwd
por padrão, então provavelmente tudo que você precisa para gerar umzsh
shell interativo no mesmo diretório de trabalho de suash
instance é executarzsh
;
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