7

В 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 ответ1

7

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

trap "stty erase ^?" SIGCHLD

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

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

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


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

#!/bin/sh
tcsh
stty erase ^?

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .