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


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

Se eu entender trap corretamente, parece que eu poderia capturar a saída t / csh de dentro do processo t / csh e executar os comandos depois que ele sair. No entanto, minha preferência seria que o trapping ocorresse no bash, que idealmente detectaria um shell 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 inadvertidamente modificar as configurações específicas do bash. Em vez de manter múltiplos trap comandos para cada shell, parece que seria melhor ter um para bash.


Minha compreensão de trap corrigir? Se sim, é possível bash detectar uma saída de shell filho e, em seguida, executar um script?


7


origem




Respostas:


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 qualquer termina o subprocesso.

Isso só funcionará em sessões interativas. Para sessões não interativas, bash  não ativará o controle de tarefas por padrão, entã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 ^?

Então, se você lançar seu shell através do script, o script executará o stty erase comando após o shell sair. É menos provável que isso tenha efeitos colaterais do que trap manipulador, 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').


7



Eu suponho que para tty configurações, o trabalho / controle não é tão grande coisa, mas tudo o mais que é provavelmente um ponto muito importante. Meu palpite é que há uma maneira de detectar o processo filho e só fazer essa armadilha se for uma casca diferente, mas isso é exatamente o que eu estava esperando - eu estava cético, mas eu estou feliz que eu perguntei - obrigado! - vol7ron
@ vol7ron Infelizmente, não há uma maneira infalível de detectar o que o processo filho era, do bash. Você pode usar jobs -n para obter trabalhos que saíram recentemente e esperamos que o último esteja correto, mas existe uma condição de corrida lá. Eu acho melhor você usar a alternativa de wrapper de script. - Floofy Fox
Eu teria pensado que a maneira mais fácil de entrar ^? é digitar o ^ personagem então o ? personagem: stty entende que o ^ caractere é um prefixo para um caractere de controle. Além disso, você pode usar o Control-V  Backspace para informar ao Vim que você deseja inserir um caractere de Backspace literal. - Adrian Pronk
@AdrianPronk Obrigado, não sabia sttyfez isso. Teve o vim literal trabalhando em um ponto, mas depois encheu alguma coisa. De qualquer forma, editado. - Floofy Fox