Executar código em um script de logout ao sair de um diretório específico?

Executar código em um script de logout ao sair de um diretório específico?

Tenho contas em várias máquinas diferentes para testar algumas bibliotecas nas quais contribuo. Algumas das máquinas pertencem a terceiros (como o farm de compilação do GCC) e eu gostaria de mantê-las organizadas.

Quero configurar um .bash_logoutscript que execute uma make cleanaçãoexit seEstou em um diretório específico. O requisito de diretório é eliminado de diversas sessões SSH. Se estou construindo/testando em uma sessão, não quero um logout de sessão separado limpando os artefatos. Ou seja, exitfrom $HOME/libfoorealiza uma limpeza; enquanto exitfrom $HOMEnão.

Eu entendo o básico, mas não está claro para mim o quão robusto isso é:

# $HOME/.bash_logout

if [ "$PWD" = "$HOME/libfoo" ]; then
    make clean 1>/dev/null 2>&1
fi

Há algum problema ao usar $PWDdurante o logout? Há algum outro problema que eu possa ter perdido?

Responder1

Sua intenção é executar o script apenas ao sair?
Do homem bash:

Quando um shell de login é encerrado, o bash lê e executa comandos do arquivo ~/.bash_logout, se existir.

Somente na saída de um shell de login do bash.


Se você pretende executar um script em cada fechamento do shell, use trap (veja man bash):

trap /u1/myuser/on_exit_script.sh EXIT

Adicione-o ao .bashrc ou algum outro que funcione para você.


Além disso, como o script será executado na saída, $PWD será aquele ativo na saída, que pode ou não ser o mesmo de quando o shell foi iniciado. Se você precisar fazer algo no $PWD que estava em uso na saída, então sim, este teste:

if [ "$PWD" = "$HOME/libfoo" ]; then

Deveria trabalhar.

Responder2

Gosto de muitos dos meus scripts de shell portáteis e independentes de shell, então prefiro capturar EXIT em vez de usar o método .bash_logout específico do bash. E para uma solução verdadeiramente independente, é melhor não precisar modificar ou criar .bash_logout, nem depender de um script separado para ser executado na saída. E é claro que muito pior seria modificar ou substituir o que o próprio comando "exit" faz no sistema - a solução não deve afetar mais ninguém!

Portanto, para um impacto mínimo em sistemas externos, meu método preferido é colocar um perfil de login personalizado sempre que eu começar a trabalhar em um sistema e fazer com que esse mesmo perfil se limpe e limpe todos os scripts auxiliares ou arquivos de configuração que ele criar. Em seguida, eu forneço esse perfil (usando "." que também funciona no ksh), que configura todos os meus aliases, etc. - mas não quero que ele permaneça quando terminar.

Então eu crio uma função shell "tchau" no próprio script que realiza a referida limpeza, e a registro para limpeza automática no logout, seja intencional ou por simples desconexão, via:

trap bye EXIT

Isso garante que não deixarei vestígios feios do meu trabalho. A limpeza específica que ele deve realizar depende de você, o "make clean" específico do diretório é apenas uma das muitas possibilidades. E uma vez que o logout tenha ocorrido por qualquer meio, todos os vestígios do perfil, incluindo até mesmo a função de limpeza, desaparecerão.

Você pode dar um passo adiante - talvez existam diferentes tipos de sistemas nos quais você deseja que ocorram diferentes tipos de limpeza ou, em alguns sistemas, você não deseja que esse tipo de limpeza ocorra. Você pode criar opções na função shell "bye" ou criar diferentes "bye1", "bye2" e registrar a desejada com base em algum teste, por exemplo, a existência de algum arquivo. É assim que evito a exclusão do meu perfil personalizado em sistemas que uso por um longo prazo, nos quais desejo manter o mesmo perfil.

Responder3

Não tenho certeza de como fazer isso através de um bash_logout, embora você possa escrever um pequeno script chamado exit que você colocaria em /usr/local/bin/ com o tipo de código que você colocou em sua pergunta, para que quando você digita exit em seu console, ele fará o que quiser se estiver no diretório específico

informação relacionada