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

3

Tenho contas em várias máquinas diferentes para testar algumas bibliotecas para as quais contribuí. Algumas das máquinas são de propriedade de outros (como a fazenda de compilação do GCC), e eu gostaria de mantê-las em ordem.

Eu quero configurar um script .bash_logout que executa make clean upon exit se eu estiver em um diretório específico. O requisito de diretório sai de várias sessões SSH. Se eu estiver construindo / testando em uma sessão, não quero um logout de sessão separado limpando os artefatos. Ou seja, exit de $HOME/libfoo executa uma limpeza; enquanto exit de $HOME não.

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

# $HOME/.bash_logout

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

Existe algum problema com o uso de $PWD durante o logout? Há algum outro problema que eu possa ter perdido?

    
por jww 18.02.2016 / 08:14

3 respostas

5

Sua intenção é executar o script apenas no logout?
Do homem bash:

When a login shell exits, bash reads and executes commands from the file ~/.bash_logout, if it exists.

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

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

trap /u1/myuser/on_exit_script.sh EXIT

Adicione ao .bashrc ou outro que funcione para você.

Além disso, como o script será executado na saída, o $ 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 ao sair, então sim, este teste:

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

Deve funcionar.

    
por 18.02.2016 / 11:54
1

Eu gosto de muitos dos meus scripts de shell portáveis e independentes de shell, então eu prefiro prender EXIT sobre o uso do método bash-específico .bash_logout. E para uma solução verdadeiramente independente, é melhor não ter que modificar ou criar .bash_logout, nem confiar em um script separado para ser executado na saída. E, claro, muito pior seria modificar ou ignorar o que o comando "exit" faz no sistema - a solução não deve afetar 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 ter o mesmo perfil limpo em si e quaisquer scripts auxiliares ou arquivos de configuração criados por ele. Eu então fonte esse perfil (usando ".", Que funciona em ksh também), que configura todos os meus aliases etc. - mas eu não quero ficar por perto quando eu terminar.

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

trap bye EXIT

Isso garante que eu não estou deixando traços feios do meu trabalho para trás. Qual limpeza específica deve ser feita por 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 traços do perfil incluindo até mesmo a função de limpeza desaparecerão.

Você pode ir um passo além - talvez haja diferentes tipos de sistemas nos quais você deseja que tipos diferentes de limpeza ocorram, ou em alguns sistemas você não quer que esse tipo de limpeza ocorra. Você pode construir comutadores na função shell "bye", ou criar diferentes "bye1", "bye2" e registrar o desejado com base em algum teste, por ex. a existência de algum arquivo. É assim que evito a exclusão do meu perfil personalizado em sistemas que uso a longo prazo, onde quero manter o mesmo perfil.

    
por 19.10.2018 / 23:53
-1

Não sei 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 no seu console, faça o que você quer se você estiver no diretório específico

    
por 18.02.2016 / 11:19