How do I prevent 'cd' command from going to home directory?

Use gedit ~/.bashrc and insert these lines at the bottom:

cd() {
    [[ $# -eq 0 ]] && return
    builtin cd "$@"
}

Open a new terminal and now when you type cd with no parameters you simply stay in the same directory.


TL;DR

If you want to be really elaborate you can put in a help screen when no parameters are passed:

$ cd

cd: missing operand

Usage:

    cd ~            Change to home directory. Equivelent to 'cd /home/$USER'

    cd -            Change to previous directory before last 'cd' command

    cd ..           Move up one directory level
    
    cd ../..        Move up two directory levels
    
    cd ../sibling   Move up one directory level and change to sibling directory

    cd /path/to/    Change to specific directory '/path/to/' eg '/var/log'

The expanded code to accomplish this is:

cd() {
    if [[ $# -eq 0 ]] ; then
        cat << 'EOF'

cd: missing operand

Usage:

    cd ~            Change to home directory. Equivelent to 'cd /home/$USER'

    cd -            Change to previous directory before last 'cd' command

    cd ..           Move up one directory level
    
    cd ../..        Move up two directory levels
    
    cd ../sibling   Move up one directory level and change to sibling directory

    cd /path/to/    Change to specific directory '/path/to/' eg '/var/log'

EOF
        return
    fi

    builtin cd "$@"
}

If it's tab completion that's causing this, one option is to make the completion cycle through entries immediately. This can be done using readline's menu-comple option instead of the default complete:

bind 'tab: menu-completion'

Then, in my home directory, for example:

$ cd <tab> # becomes
$ cd .Trash

Of course, even then you'd have to read what you're executing.


Here's how I put the current dir and user in my windows title - You can adapt it to your need, but cd -, equivalent to cd $OLDPWD is a better solution.

From my ~/.bashrc:

# from the "xttitle(1)" man page - put info in window title
update_title()
{
    [[ $TERM = xterm ]] || [[ $TERM = xterm-color ]]  && xttitle "[$$] ${USER}@${HOSTNAME}:$PWD"
}

cd()
{
    [[ -z "$*" ]] && builtin cd $HOME
    [[ -n "$*" ]] && builtin cd "$*"
    update_title
}