logo

Bash

Last Updated: 2023-12-06

Bash is (almost) universally available on Linux, macOS, and even Windows.

The official manual: http://www.gnu.org/software/bash/manual/bash.html

Check Bash Version

  • bash --version
  • echo "${BASH_VERSION}"
  • Ctrl+x Ctrl+v

Image Not Found

Error

dyld: Library not loaded: /usr/local/opt/readline/lib/libreadline.6.dylib
  Referenced from: /usr/local/bin/bash
  Reason: image not found
Trace/BPT trap: 5

Solution

Reinstall bash

$ brew upgrade bash

Style Guide

Use "$foo", or "${foo}", not $foo

Different from the POSIX shell

  • [[ condition ]] does not work; use [ condition ]
  • Arrays do not work; use IFS
  • Local variables do not work; use a subshell

Config

Bash uses two startup configuration files .bashrc and .bash_profile to initialize and customize the shell.

# .bashrc
# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

# .bash_profile
#
# Get the aliases and functions from .bashrc
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

such as alias rm = "rm -i" and export more variables (such as export PAGER=less).

Your new settings may be added to either .bashrc or .bash_profile. Basically, .bashrc and .bash_profile are run under different conditions. If you ssh <server> <command>, the shell will run ~/.bashrc; if you ssh <server> (with no <command>) or slogin <server>, the shell will run ~/.bash_profile. Certain types of commands belong to .bash_profile and are best kept out of .bashrc.

'export' your variables in order to have them show in env

Add .bashrc to ~/.bash_profile

if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi

Change Terminal Color

export CLICOLOR=1
export LSCOLORS=ExFxCxDxBxegedabagacad

Always Search Current Folder First

Add to ~/.bashrc or ~/.bash_profile

export PATH=`pwd`:$PATH

Style Your Prompt

  • PS1: the primary prompt display, where you set special characters or important information.
  • PS2: the secondary prompt string, usually set as a divider between the prompt display and the text entry. It is also used to display when a long command is broken into sections with the \ sign.
  • PS3: for the select command.
  • PS4: for running a shell script in debug mode.

Add to ~/.bashrc or ~/.bash_profile

function prompt {
  local    NO_COLOR="\e[0m"
  local       BLACK="\[\033[0;30m\]"
  local         RED="\[\033[0;31m\]"
  local   LIGHT_RED="\[\033[1;31m\]"
  local       GREEN="\[\033[0;32m\]"
  local LIGHT_GREEN="\[\033[1;32m\]"
  local      YELLOW="\[\033[0;33m\]"
  local        BLUE="\[\033[0;34m\]"
  local     MAGENTA="\[\033[0;35m\]"
  local        CYAN="\[\033[0;36m\]"
  local       WHITE="\[\033[1;37m\]"
  local  LIGHT_GRAY="\[\033[0;37m\]"

  PS1="\n${RED}\u@\h: ${GREEN}\w ${NO_COLOR}\n\$ "
}
prompt

It should look like:

<user(red)>@<host(green)>: <working folder>
$

Color Scheme

DULL=0
BRIGHT=1

FG_BLACK=30
FG_RED=31
FG_GREEN=32
FG_YELLOW=33
FG_BLUE=34
FG_VIOLET=35
FG_CYAN=36
FG_WHITE=37

FG_NULL=00

BG_BLACK=40
BG_RED=41
BG_GREEN=42
BG_YELLOW=43
BG_BLUE=44
BG_VIOLET=45
BG_CYAN=46
BG_WHITE=47

BG_NULL=00

##
# ANSI Escape Commands
##
ESC="\033"
NORMAL="\[$ESC[m\]"
RESET="\[$ESC[${DULL};${FG_WHITE};${BG_NULL}m\]"

##
# Shortcuts for Colored Text ( Bright and FG Only )
##

# DULL TEXT

BLACK="\[$ESC[${DULL};${FG_BLACK}m\]"
RED="\[$ESC[${DULL};${FG_RED}m\]"
GREEN="\[$ESC[${DULL};${FG_GREEN}m\]"
YELLOW="\[$ESC[${DULL};${FG_YELLOW}m\]"
BLUE="\[$ESC[${DULL};${FG_BLUE}m\]"
VIOLET="\[$ESC[${DULL};${FG_VIOLET}m\]"
CYAN="\[$ESC[${DULL};${FG_CYAN}m\]"
WHITE="\[$ESC[${DULL};${FG_WHITE}m\]"

# BRIGHT TEXT
BRIGHT_BLACK="\[$ESC[${BRIGHT};${FG_BLACK}m\]"
BRIGHT_RED="\[$ESC[${BRIGHT};${FG_RED}m\]"
BRIGHT_GREEN="\[$ESC[${BRIGHT};${FG_GREEN}m\]"
BRIGHT_YELLOW="\[$ESC[${BRIGHT};${FG_YELLOW}m\]"
BRIGHT_BLUE="\[$ESC[${BRIGHT};${FG_BLUE}m\]"
BRIGHT_VIOLET="\[$ESC[${BRIGHT};${FG_VIOLET}m\]"
BRIGHT_CYAN="\[$ESC[${BRIGHT};${FG_CYAN}m\]"
BRIGHT_WHITE="\[$ESC[${BRIGHT};${FG_WHITE}m\]"

# REV TEXT as an example
REV_CYAN="\[$ESC[${DULL};${BG_WHITE};${BG_CYAN}m\]"
REV_RED="\[$ESC[${DULL};${FG_YELLOW}; ${BG_RED}m\]"

PROMPT_COMMAND='export ERR=$?'

Show Current Git Branch

Add to ~/.bashrc or ~/.bash_profile

function parse_git_branch {
  git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/'
}

Then change the last line in prompt function to

PS1="\n${RED}\u@\h:${BLUE}\$(parse_git_branch) ${GREEN}\w ${BLACK}\n\$ "

path_helper

The path_helper utility reads the contents of the files in the directories /etc/paths.d and /etc/manpaths.d and appends their contents to the PATH and MANPATH environment variables respectively. Files in these directories should contain one path element per line.

/etc/profile

# System-wide .profile for sh(1)

if [ -x /usr/libexec/path_helper ]; then
    eval `/usr/libexec/path_helper -s`
fi

if [ "${BASH-no}" != "no" ]; then
    [ -r /etc/bashrc ] && . /etc/bashrc
fi