
Tengo cuentas en varias máquinas diferentes para probar un par de bibliotecas en las que contribuyo. Algunas de las máquinas son propiedad de otros (como la granja de compilación GCC) y me gustaría mantenerlas ordenadas.
Quiero configurar un .bash_logout
script que realice make clean
unaexit
siEstoy en un directorio particular. El requisito del directorio desaparece de varias sesiones SSH. Si estoy compilando/probando en una sesión, no quiero cerrar sesión en una sesión separada para limpiar los artefactos. Es decir, exit
from $HOME/libfoo
realiza una limpieza; mientras exit
que de $HOME
no.
Entiendo los conceptos básicos, pero no tengo claro qué tan sólido es esto:
# $HOME/.bash_logout
if [ "$PWD" = "$HOME/libfoo" ]; then
make clean 1>/dev/null 2>&1
fi
¿Hay algún problema con el uso $PWD
durante el cierre de sesión? ¿Hay otros problemas que podría haber pasado por alto?
Respuesta1
¿Su intención es ejecutar el script solo al cerrar sesión?
De hombre bash:
Cuando se cierra un shell de inicio de sesión, bash lee y ejecuta comandos del archivo ~/.bash_logout, si existe.
Solo al salir de un shell de inicio de sesión de bash.
Si tiene la intención de ejecutar un script cada vez que se cierra el shell, use trap (consulte man bash):
trap /u1/myuser/on_exit_script.sh EXIT
Agréguelo a .bashrc o algún otro que funcione para usted.
Además, como el script se ejecutará al salir, $PWD será el que esté activo al salir, que puede ser o no el mismo que cuando se inició el shell. Si necesita hacer algo en el $PWD que estaba en uso al salir, entonces sí, esta prueba:
if [ "$PWD" = "$HOME/libfoo" ]; then
Deberia trabajar.
Respuesta2
Me gustan muchos de mis scripts de shell portátiles e independientes del shell, por lo que prefiero capturar EXIT en lugar de usar el método .bash_logout específico de bash. Y para una solución verdaderamente independiente, es mejor no tener que modificar o crear .bash_logout, ni depender de un script separado que se ejecutará al salir. Y, por supuesto, mucho peor sería modificar o anular lo que hace el comando "salir" en el sistema: ¡la solución no debería afectar a nadie más!
Entonces, para lograr un impacto mínimo en sistemas externos, mi método preferido es colocar un perfil de inicio de sesión personalizado cada vez que comienzo a trabajar en un sistema, y hacer que ese mismo perfil se limpie solo y cualquier script auxiliar o archivo de configuración que cree. Luego obtengo ese perfil (usando "." que también funciona bajo ksh), que configura todos mis alias, etc., pero no quiero que se quede cuando termine.
Así que creo una función de shell "adiós" en el propio script que realiza dicha limpieza y la registro para la limpieza automática al cerrar sesión, ya sea intencional o por simple desconexión, a través de:
trap bye EXIT
Eso garantiza que no deje rastros desagradables de mi trabajo. La limpieza específica que debe realizar depende de usted; la "limpieza" específica del directorio es solo una de muchas posibilidades. Y una vez que se ha cerrado la sesión por cualquier medio, todos los rastros del perfil, incluida incluso la función de limpieza, desaparecen.
Puede ir un paso más allá: tal vez haya diferentes tipos de sistemas en los que desee que se realicen diferentes tipos de limpieza, o en algunos sistemas no desee que se realice este tipo de limpieza en absoluto. Puede crear interruptores en la función de shell "bye", o crear diferentes "bye1", "bye2" y registrar el deseado basándose en alguna prueba, por ejemplo, la existencia de algún archivo. Así es como evito la eliminación de mi perfil personalizado en sistemas que uso a largo plazo, donde quiero mantener el mismo perfil.
Respuesta3
No estoy seguro de cómo hacerlo a través de bash_logout, aunque podrías escribir un pequeño script llamado exit que pondrías en /usr/local/bin/ con el tipo de código que pusiste en tu pregunta, para que cuando escribes salir en tu consola y hará lo que quieras si estás en el directorio específico