zsh fornisce alcune belle funzioni hook , anche chpwd
per eseguire una funzione dopo che l'utente cambia directory.
# zsh only
function greet() { echo 'hi'; }
chpwd_functions+=("greet")
cd .. # hi
pushd # hi
popd # hi
Sto cercando di emularlo in bash.
vincoli:
- Deve funzionare in shell interattive e non interattive, il che penso significhi che non può fare affidamento su qualcosa di simile
$PROMPT_COMMAND
- Non può ridefinire
cd
, perché voglio che funzioni per qualsiasi comando che cambi directory (es.,pushd
Epopd
) - Deve essere eseguito dopo il comando dell'utente, quindi
trap "my_function" DEBUG
non funziona, a meno che non riesca in qualche modo a dire lì "esegui prima il$BASH_COMMAND
trapping, quindi fai questo ..." Vedo che posso evitare l'esecuzione automatica di$BASH_COMMAND
ifextdebug
è abilitato e la funzione trap restituisce 1, ma non credo di voler forzareextdebug
, e tornare1
per un comando riuscito (ma modificato) sembra sbagliato.
L'ultima parte - "corri dietro il comando dell'utente" - è ciò che attualmente mi ha lasciato perplesso. Se riesco a eseguire una funzione dopo ogni comando, posso farlo controllare se la directory è cambiata dall'ultima volta che abbiamo controllato. Per esempio:
function check_pwd() {
# true in a new shell (empty var) or after cd
if [ "$LAST_CHECKED_DIR" != "$PWD" ]; then
my_function
fi
LAST_CHECKED_DIR=$PWD
}
Sono sulla buona strada o c'è un modo migliore? Come posso eseguire un comando in bash dopo che l'utente cambia directory?
cd
come principio.
MYBIN=$( cd -P -- "$(dirname -- "$(command -v -- "$0")")" && pwd -P )
Si prega di non modificare i comandi Unix attendibili.
bash
, che funziona praticamente allo stesso modo su tutti i sistemi operativi su cui gira.
cd
,pushd
epopd
? In quanti altri modi ci sono per cambiare directory?