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

992
vol7ron

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

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

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


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

7

1 ответ на вопрос

7
Floofy Fox

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

trap "stty erase ^?" SIGCHLD 

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

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

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


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

#!/bin/sh tcsh stty erase ^? 

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

Я полагаю, что для настроек tty работа / контроль не так важны, но все остальное, вероятно, очень важный момент. Я предполагаю, что есть способ обнаружить дочерний процесс и делать эту ловушку, только если это другая оболочка, но это именно то, на что я надеялся - я был настроен скептически, но я рад, что спросил - спасибо! vol7ron 6 лет назад 0
@ vol7ron К сожалению, нет надежного способа определить, что представляет собой дочерний процесс, с помощью bash. Вы можете использовать `jobs -n`, чтобы получить недавно вышедшие вакансии, и, надеюсь, последняя верна, но там есть условие гонки. Я думаю, что вам лучше использовать альтернативу скрипт-обертки. Floofy Fox 6 лет назад 0
Я бы подумал, что самый простой способ ввести `^?` - это ввести символ `^`, а затем символ `?`: `Stty` понимает, что символ` ^ `является префиксом для управляющего символа. Также вы можете использовать `Control-V`` Backspace`, чтобы сообщить Vim, что вы хотите вставить буквенный символ Backspace. Adrian Pronk 6 лет назад 1
@AdrianPronk Спасибо, я не знал, что stty сделал это. Если бы Vim Literal один работал в одной точке, но потом что-то набил. Во всяком случае, отредактировано. Floofy Fox 6 лет назад 0

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