#!/usr/bin/env bash
# Author: James Cherti
# License: MIT
# URL: https://www.jamescherti.com/shell-bash-replacement-bash-cd-change-directory/
#
# Description:
# 1. 'cd path/to/file' will change the directory to 'path/to'
# (the parent directory of 'file').
#
# 2. 'cd path/to/dir with spaces' will change the directory to
# "path/to/dir with spaces".
#
# 3. 'cd file:///home/user' will change the directory to "/home/user".
#
# 4. You can switch to the previous directory with 'popd' or 'cd -'.
#
# Add the following function and alias to ~/.bashrc :
#
_better_cd() {
# Previous directory ('cd -')
if [[ $# -eq 1 ]] && [[ $1 = '-' ]]; then
popd >/dev/null || return 1
return 0
fi
# Join paths
local path
if [[ $# -eq 0 ]]; then
path="$HOME"
else
path=$(echo "$1" | sed -e 's/^file:\/\///')
shift
local item
for item in "$@"; do
path="${path} ${item}"
done
fi
# Checks
local errno=0
if [[ -f "$path" ]]; then
path=$(dirname "$path")
fi
if ! [[ -d "$path" ]]; then
echo "$(basename "$0"):" "cd: $path: No such file or directory" >&2
return 1
fi
# Change the directory
local oldcwd; oldcwd=$(pwd)
pushd . >/dev/null || return 1
builtin cd "$path" >/dev/null 2>&1 || errno=1
if [[ $oldcwd = "$(pwd)" ]]; then
popd >/dev/null || return 1
fi
return "$errno"
}
alias cd=_better_cd
Code language: Bash (bash)