En vous connectant à PROMPT_COMMAND de bash, cette fonction est exécutée chaque fois que vous obtenez une nouvelle invite, c'est donc un moment décent pour vérifier si vous êtes dans un répertoire pour lequel vous souhaitez un historique personnalisé. La fonction a quatre branches principales:
- Si le répertoire courant (
$PWD
) n'a pas changé, ne faites rien (retour).
Si le PWD a changé, nous mettons en place une fonction locale dont le seul but est de factoriser le code "répertoire personnalisé" en un seul endroit. Vous voudrez remplacer mes répertoires de test par les vôtres (séparés par |
).
- Si nous n'avons pas changé dans ou hors d'un répertoire personnalisé, mettez simplement à jour la variable "répertoire précédent" et sortez de la fonction.
Puisque nous avons changé de répertoire, mettez à jour la variable "répertoire précédent", puis enregistrez l'historique en mémoire dans le HISTFILE, puis effacez l'historique en mémoire.
Si nous avons changé en un répertoire personnalisé, définissez HISTFILE pour être un .bash_history
fichier dans le répertoire actuel.
Sinon, nous avons changé de répertoire personnalisé, alors réinitialisez HISTFILE dans le répertoire d'origine.
Enfin, puisque nous avons modifié les fichiers d'historique, relisez cet historique précédent.
Pour faire avancer les choses, le script définit la valeur PROMPT_COMMAND et enregistre deux variables à usage interne (le stock HISTFILE et le "répertoire précédent").
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