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/cd
in my CentOS, so this solution might not going to work – UVV Nov 27 '14 at 13:32cd -P public_html
orcd ~/public_html
or has unexpected behaviour if you can'tcd
intopublic_html
. – Stéphane Chazelas Nov 27 '14 at 16:01.bash_profile
is for session settings, not for customisingbash
(for which there's~/.bashrc
) – Stéphane Chazelas Nov 27 '14 at 16:04