Запустите новый gnome-терминал с несколькими вкладками и дождитесь запуска команды

Я хочу запустить новое окно терминала 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 блокирующая вкладка 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'"

Это будет держать обе вкладки открытыми с подсказкой.

3
задан 13 April 2017 в 15:23

1 ответ

Использовать 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
2
ответ дан 14 April 2017 в 01:23
  • 1
    Ха... хорошо это, конечно, вводит в заблуждение, и почему hasn' t, что указанный где угодно вне меня. Огромное спасибо так или иначе! – JDaley 29 November 2016 в 03:15

Другие вопросы по тегам:

Похожие вопросы: