Podłączając się do PROMPT_COMMAND firmy bash, ta funkcja uruchamia się za każdym razem, gdy pojawi się nowy monit, więc jest to dobry czas, aby sprawdzić, czy znajdujesz się w katalogu, dla którego chcesz mieć własną historię. Funkcja ma cztery główne gałęzie:
- Jeśli bieżący katalog (
$PWD
) nie zmienił się, nie rób nic (powrót).
Jeśli PWD uległo zmianie, wówczas konfigurujemy funkcję lokalną, której jedynym celem jest faktyczne umieszczenie kodu „katalogu niestandardowego” w jednym miejscu. Będziesz chciał zastąpić moje katalogi testowe własnymi (oddzielonymi przez |
).
- Jeśli nie zmieniliśmy katalogu niestandardowego ani nie wyszliśmy z niego, po prostu zaktualizuj zmienną „poprzedni katalog” i powróć z funkcji.
Ponieważ zmieniliśmy katalogi, zaktualizuj zmienną „poprzedni katalog”, a następnie zapisz historię w pamięci do HISTFILE, a następnie wyczyść historię w pamięci.
Jeśli zmieniliśmy w katalogu niestandardowym, a następnie ustawić HISTFILE być .bash_history
plik w bieżącym katalogu.
W przeciwnym razie, zmieniliśmy z katalogu niestandardowym, więc zresetować HISTFILE do jednej akcji.
Wreszcie, ponieważ zmieniliśmy pliki historii, przeczytaj ponownie poprzednią historię.
Aby wszystko działało, skrypt ustawia wartość PROMPT_COMMAND i zapisuje dwie zmienne do użytku wewnętrznego (podstawowy HISTFILE i „poprzedni katalog”).
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