Я хочу запустить новое окно терминала gnome с некоторой командой на нескольких вкладках. Исходя из этого вопроса :
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'"
Проблема, с которой я сталкиваюсь, заключается в том, что после I CTRL-C kbd> блокирующая вкладка tail -f
просто закрывается и исчезает , Хотя мне бы хотелось, чтобы он оставался открытым и, возможно, проверил прошлые результаты.
Почему-то я предполагаю, что какой-то родитель получает SIGINT
и бросает все вместе, вместо того, чтобы отправить его в команду tail
.
Например, простой sleep
работает просто отлично:
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'"
Это будет держать обе вкладки открытыми с подсказкой.
Использовать zsh
trap
встроенный ( trap
встроенный также присутствует в bash
):
gnome-terminal --tab -t "FOO" -e "zsh" \
--tab -t "XYZ" -e "zsh -c 'trap \"zsh\" 2; tail -f /var/log/dmesg'"
Или:
gnome-terminal --tab -t "FOO" -e "zsh" \
--tab -t "XYZ" -e "zsh -c 'trap \"zsh\" SIGINT; tail -f /var/log/dmesg'"
Похоже на выполнение этого от sh
. Некоторые примечания стороны:
zsh
в Вашей установке находится в /bin
(следовательно в path
) уже, таким образом, все необходимо породить a zsh
оболочка zsh
;zsh
выполнения в интерактивном режиме по умолчанию, так вероятно, все необходимо породить интерактивное zsh
оболочка должна работать zsh
;zsh
достаточно умно для чтения pwd
по умолчанию, так вероятно, все необходимо породить интерактивное zsh
оболочка в том же рабочем каталоге Вашего sh
экземпляр должен работать zsh
;Проблемой, как Вы думали, является сигнал SIGINT, который распространен ко всем процессам в той же группе процесса процесса, получающего сигнал.
Используя trap 'zsh' 2
/ trap 'zsh' SIGINT
ток zsh
экземпляр установлен породить другого zsh
экземпляр на прием сигнала SIGINT, который обходит проблему.
Можно также сделать zsh
экземпляр, "неуязвимый" для нескольких сигналов путем списка их разделенный пробелом в аргументах:
trap 'zsh' 1 2 3 [...]
Или:
trap 'zsh' SIGHUP SIGINT SIGQUIT [...]
Можно распечатать заказанный список все все доступные сигналы путем выполнения 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