Есть ли у 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'
).