O bash tem um gancho para determinar quando sai o shell filho?

7

Em bash , giro um t/csh shell, que atualiza a entrada tty ( stty erase ^H ) no .cshrc, mas quando exit -ing e retornando para bash o backspace chave não funciona mais. Isso ocorre porque o bash usa readline e eu preciso redefinir o apagamento ( stty erase ^? ).

Se eu entendi trap corretamente, parece que eu poderia capturar a saída t / csh de dentro do processo t / csh e executar comandos depois que ela sair. No entanto, minha preferência seria que o trapping ocorresse no bash, que idealmente detectaria que um shell era chamado / exited e, em seguida, executaria um script para redefinir suas configurações.

Isso é preferível porque eu poderia chamar qualquer número de shells (por exemplo, dash , zsh ), que pode modificar inadvertidamente configurações específicas de bash. Em vez de manter vários comandos trap para cada shell, parece que seria melhor ter um para o bash.

Meu entendimento de trap está correto? Em caso afirmativo, é possível que bash detecte uma saída do shell secundário e, em seguida, execute um script?

    
por vol7ron 05.05.2017 / 18:25

1 resposta

7

Você estava no caminho certo com trap . O que você quer é o seguinte:

trap "stty erase ^?" SIGCHLD

Você pode adicionar isso a .bashrc . Observe que isso será executado quando o qualquer subprocesso terminar.

Isso só funcionará em sessões interativas. Para sessões não interativas, bash não ativará o controle de tarefas Por padrão, você precisará executar set -o monitor primeiro. Mas duvido que você precise de backspaces em scripts não interativos.

SIGCHLD é enviado para o processo pai sempre que um subprocesso é encerrado.

Um método alternativo é envolver seu outro shell em um script, como:

#!/bin/sh
tcsh
stty erase ^?

Em seguida, se você iniciar seu shell por meio do script, o script executará o comando stty erase após a conclusão do shell. Isso é menos provável de ter efeitos colaterais do que um manipulador global trap , mas é claro que só funcionará se você iniciar o script toda vez (ou criar um alias para fazer isso, por exemplo, alias 'tcsh' '~/launch-tcsh.sh' ).

    
por 05.05.2017 / 18:45