Wrapping cd, an existing command, is not recommended.
A more universal solution would be defining a custom chpwd hook in Bash. (According to tags of this question, I assume you're using Bash)
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 functions
typeset -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 empty
PROMPT_COMMAND="_chpwd_hook${PROMPT_COMMAND:+;$PROMPT_COMMAND}"
Since we're detecting PWD change directly, the solution works with cd, pushd, and popd.
Note: The main difference between our chpwd implementaion in Bash and the chpwd in ZSH is, PROMPT_COMMAND is not supported in a non-interactive Bash shell.
Usage
_public_html_action() {
if [[ $PWD == */public_html ]]; then
# actions
fi
}
# append the command into CHPWD_COMMAND
CHPWD_COMMAND="${CHPWD_COMMAND:+$CHPWD_COMMAND;}_public_html_action"
Source: Create chpwd Equivalent Hook in Bash from my gist.
For anyone want an answer for ZSH. Use chpwd hook in ZSH. Don't define chpwd() function directly. More detail here.
echo "Testing..."just above the if, but nothings output. Do I need do something to apply these changes? – TMH Nov 27 '14 at 13:19. ~/.bash_profile– UVV Nov 27 '14 at 13:20/bin/cdin my CentOS, so this solution might not going to work – UVV Nov 27 '14 at 13:32cd -P public_htmlorcd ~/public_htmlor has unexpected behaviour if you can'tcdintopublic_html. – Stéphane Chazelas Nov 27 '14 at 16:01.bash_profileis for session settings, not for customisingbash(for which there's~/.bashrc) – Stéphane Chazelas Nov 27 '14 at 16:04