Есть ли у bash ловушка для определения выхода дочерней оболочки?

В bash Я раскручиваю t/csh оболочка, которая обновляет ввод tty (stty erase ^H) в.cshrc, но когда exit-ing и возвращение, чтобы bash клавишу Backspace больше не работает. Это потому, что Bash использует readline и мне нужно сбросить стирание (stty erase ^?).

Если я понимаю trap правильно, похоже, что я мог бы перехватить выход t/csh из процесса t/csh и запускать команды после его выхода. Тем не менее, я бы предпочел, чтобы перехват происходил в bash, который в идеале должен был бы обнаружить, что оболочка была вызвана / завершена, а затем запустить скрипт для сброса настроек.

Это предпочтительнее, потому что я могу назвать любое количество оболочек (например, dash, zsh), что может непреднамеренно изменить настройки, относящиеся к bash. Вместо поддержания нескольких trap Похоже, что для команд для каждой оболочки было бы лучше иметь команду для bash.


Мое понимание trap правильный? Если это так, возможно ли bash обнаружить выход дочерней оболочки и затем запустить скрипт?

1 ответ

Решение

Вы были на правильном пути с trap, То, что вы хотите, это следующее:

trap "stty erase ^?" SIGCHLD

Вы можете добавить это к .bashrc, Обратите внимание, что это будет выполняться, когда любой подпроцесс завершится.

Это будет работать только в интерактивных сессиях. Для неинтерактивных сессий, bash по умолчанию не включит управление заданиями, поэтому вам нужно будет запустить set -o monitor первый. Но я сомневаюсь, что вам понадобятся возвраты в неинтерактивных скриптах.

SIGCHLD отправляется родительскому процессу при выходе из подпроцесса.


Альтернативный метод заключается в том, чтобы обернуть другую оболочку в скрипт, например:

#!/bin/sh
tcsh
stty erase ^?

Затем, если вы запустите свою оболочку через скрипт, скрипт запустит stty erase Команда после выхода из оболочки. Это менее вероятно, будет иметь побочные эффекты, чем глобальный trap обработчик, но, конечно, он будет работать, только если вы запускаете скрипт каждый раз (или создаете для этого псевдоним, например alias 'tcsh' '~/launch-tcsh.sh').

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