I really like the directory bookmark/browsing ability of tcsh, when aliasing the pushd command to cd. Using bash, I would naturally like to have the same abilities.
The following listing is of a tcsh session displaying the desired functionality:
$ cd dir3 $ dirs 0 ~/tmp/dir1/dir2/dir3 1 ~/tmp/dir1/dir2 2 ~/tmp/dir1 3 ~/tmp $ cd +2 $ pwd /home/user/tmp/dir1 $ dirs 0 ~/tmp/dir1 1 ~/tmp 2 ~/tmp/dir1/dir2/dir3 3 ~/tmp/dir1/dir2 $
To get the above behavior in tcsh, a few settings needs to be put into the ~/.tcshrc initializations file:
# .tcshrc alias dirs 'dirs -vl' set dunique set pushdsilent set pushdtohome alias cd 'pushd \!*'
Out of the box, we cannot mimic these tcsh settings in bash, because no counterparts exists. So we need a script:
# .bashrc
alias dirs='dirs -v'
cd() {
   local i MAX LEN p
   MAX=10
   LEN=${#DIRSTACK[@]}
   if [ $# -eq 0 ] || [ "$1" = "-" ]; then
      builtin cd "$@" || return 1
      pushd -n $OLDPWD > /dev/null
   else
      pushd "$@" > /dev/null || return 1
   fi
   if [ $LEN -gt 1 ]; then
      for ((i=1; i <= LEN ; i++)); do
         eval p=~$i
         if [ "$p" = "$PWD" ]; then
            popd -n +$i > /dev/null
            break
         fi
      done
   fi
   if [ $LEN -ge $MAX ]; then
      popd -n -0 > /dev/null
   fi
}
When this function is put into the ~/.bashrc initialization file, the bash cd command behave exactly as it does in tcsh.