Is there a hook in Bash to find out when the cwd changes?
A better solution could be defining a custom chpwd
hook.
There's not a complete hook system designed in Bash when compared with other modern shells. PROMPT_COMMAND
variable is used as a hook function, which is equivalent to precmd
hook in ZSH, fish_prompt
in Fish. For the time being, ZSH is the only shell I've known that has a chpwd
hook builtin.
PROMPT_COMMAND
If set, the value is interpreted as a command to execute before the printing of each primary prompt ($PS1).
https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Bash-Variables
chpwd
Hook in Bash
A trick is provided to setup a chpwd
equivalent hook in Bash based on PROMPT_COMMAND
.
# create a PROPMT_COMMAND equivalent to store chpwd functionstypeset -g CHPWD_COMMAND=""_chpwd_hook() { shopt -s nullglob local f # run commands in CHPWD_COMMAND variable on dir change if [[ "$PREVPWD" != "$PWD" ]]; then local IFS=$';' for f in $CHPWD_COMMAND; do "$f" done unset IFS fi # refresh last working dir record export PREVPWD="$PWD"}# add `;` after _chpwd_hook if PROMPT_COMMAND is not emptyPROMPT_COMMAND="_chpwd_hook${PROMPT_COMMAND:+;$PROMPT_COMMAND}"
Usage
# example 1: `ls` list directory once dir is changed_ls_on_cwd_change() { ls}# append the command into CHPWD_COMMANDCHPWD_COMMAND="${CHPWD_COMMAND:+$CHPWD_COMMAND;}_ls_on_cwd_change"# or just use `ls` directlyCHPWD_COMMAND="${CHPWD_COMMAND:+$CHPWD_COMMAND;}ls"
Source: Create chpwd Equivalent Hook in Bash from my gist.