Al engancharse a PROMPT_COMMAND de bash, esta función se ejecuta cada vez que recibe una nueva solicitud, por lo que es un momento decente para verificar si está en un directorio para el que desea un historial personalizado. La función tiene cuatro ramas principales:
- Si el directorio actual (
$PWD
) no ha cambiado, no haga nada (volver).
Si el PWD ha cambiado, entonces configuramos una función local cuyo único propósito es factorizar el código del "directorio personalizado" en un solo lugar. Querrás reemplazar mis directorios de prueba con los tuyos (separados por |
).
- Si no hemos cambiado dentro o fuera de un directorio personalizado, simplemente actualice la variable "directorio anterior" y regrese de la función.
Como hemos cambiado los directorios, actualice la variable "directorio anterior", luego guarde el historial en memoria en HISTFILE, luego borre el historial en memoria.
Si hemos cambiado a un directorio personalizado, configure HISTFILE para que sea un .bash_history
archivo en el directorio actual.
De lo contrario, hemos cambiado de un directorio personalizado, por lo que restablece HISTFILE al stock.
Finalmente, como hemos cambiado los archivos del historial, vuelva a leer el historial anterior.
Para que todo funcione, el script establece el valor PROMPT_COMMAND y guarda dos variables de uso interno (el archivo HISTFILE y el "directorio anterior").
prompt_command() {
# if PWD has not changed, just return
[[ $PWD == $_cust_hist_opwd ]] && return
function iscustom {
# returns 'true' if the passed argument is a custom-history directory
case "$1" in
( */tmp/faber/somedir | */tmp/faber/someotherdir ) return 0;;
( * ) return 1;;
esac
}
# PWD changed, but it's not to or from a custom-history directory,
# so update opwd and return
if ! iscustom "$PWD" && ! iscustom "$_cust_hist_opwd"
then
_cust_hist_opwd=$PWD
return
fi
# we've changed directories to and/or from a custom-history directory
# save the new PWD
_cust_hist_opwd=$PWD
# save and then clear the old history
history -a
history -c
# if we've changed into or out of a custom directory, set or reset HISTFILE appropriately
if iscustom "$PWD"
then
HISTFILE=$PWD/.bash_history
else
HISTFILE=$_cust_hist_stock_histfile
fi
# pull back in the previous history
history -r
}
PROMPT_COMMAND='prompt_command'
_cust_hist_stock_histfile=$HISTFILE
_cust_hist_opwd=$PWD