Bash cd function

I have a cd function I wrote for bash that I kind of like. It has two pieces of functionality that are probably quite useful:

  1. If you cd to file via

    cd <filename>
    

    it takes you to the parent directory.

  2. The cd command stores the last directory you were working in in a file $HOME/lastdir. In combination with

    urxvt -cd `cat $HOME/lastdir`,
    

    I can quickly fire up a new terminal to the last directory I was working in. I think there are other ways to do it, but I like my way since I am able to add exceptions to the lastdir functionality. For example, if I am in a remote filesystem or nfs directory, then due to various problems (e.g., poor network) the urxvt -cd command will hang and take forever.

    function cd
    {

        ### Configuration ###
        # assigning "$@" to a variable helps somehow.
        args="$@"
        host=$(hostname -a)

        # logfile for cd command. Set to empty to not log.
        logcd="$HOME/logs/cd-${host}"

        # if the current directory matches a list of exceptions, then do not write it to .last_dir
        except_dirs='/mnt/sshfs /mnt/box-remote /mnt/nfsmount /media /run/media /home/arjun/201-sshfs'
        ### End Configuration ###

        # the builtin cd is to avoid recursion
        if [[ -f "$args" ]]; then
            # if asked to cd to a file, find dirname and cd to it
            if ! builtin cd "$(dirname "$args")"; then
                return 1
            fi
        else
            # directly try the builtin cd on
            if ! builtin cd "$args"; then
                return 1
            fi
        fi

        cdir=$(pwd) #current directory that the builtin would have changed to if successful
        if [[ -w "$logcd" ]]; then
            # if logfile for cd is writeable
            echo "$cdir" >> "$logcd"
        fi

        for x in $except_dirs; do
            if echo "$cdir" | grep "$x" > /dev/null; then
                return 1
                # cat $HOME/.last_dir
            fi
        done

        # if any of the except dirs had matched, it would have exited
        echo "$cdir" > $HOME/.last_dir
        return 0
    }