Skip to content

Instantly share code, notes, and snippets.

@johnhpatton
Created June 22, 2022 11:38
Show Gist options
  • Save johnhpatton/6879a89644f3bb917c4e728880860bd5 to your computer and use it in GitHub Desktop.
Save johnhpatton/6879a89644f3bb917c4e728880860bd5 to your computer and use it in GitHub Desktop.
a pretty good .bashrc
logbashrc() {
(( INTERACTIVE )) && echo "$1"
return 0
}
pathdedup() {
local retval=0
local opt= dir= deduped=
# default to PATH
local pathvar="${1:-"PATH"}"
# delimeter, default to :
local delim="${2:-:}"
# dereference the path variable
local pathval=${!pathvar}
if [ -n "${pathval}" ]; then
while IFS= read -d${delim} dir; do
[ ! -d "${dir%/}" ] && continue # skip adding folders that do not exist
[[ ${deduped}${delim} =~ .*${delim}${dir%/}${delim}.* ]] || deduped+="${delim}${dir%/}"
done <<< "${pathval}${delim}"
else
retval=1
fi
# eval and export path variable
(( retval == 0 )) && eval $pathvar=$deduped && export $pathvar
return $(( retval ))
}
pathadd() {
local retval=0
local opt= dir=
[[ "${1:0:1}" = "-" ]] && opt=$1 && shift
# newpath to add, remove any trailing / character
local newpath="${1%/}"
# default to PATH
local pathvar="${2:-"PATH"}"
# delimeter, default to :
local delim="${3:-:}"
# dereference the path variable
local pathval=${!pathvar}
if [ -d "$newpath" ] && [[ ":$pathval:" != *":$newpath:"* ]]; then
# prepend when $opt = "-p", otherwise append
[ "$opt" == "-p" ] && pathval="$newpath${pathval:+"${delim}${pathval}"}" || pathval="${pathval:+"${pathval}${delim}"}$newpath"
# eval and export path variable
(( retval == 0 )) && eval $pathvar=$pathval && export $pathvar
elif [ ! -d "$newpath" ]; then
retval=1
# else already added
fi
return $(( retval ))
}
# Global function
function akamaicli {
if [[ `docker ps | grep akamai-cli$ | wc -l` -eq 1 ]]; then
docker exec -it akamai-cli akamai $@;
elif docker start akamai-cli &>/dev/null && sleep 3 && docker exec -it akamai-cli akamai $@; then
return 0;
else
echo "Creating new docker container"
mkdir -p $HOME/.akamai-cli-docker
docker exec -it --mount source=vol-akamai-devops,target=$HOME/akamai --mount source=/cli,target=$HOME/.akamai-cli-docker --name akamai-cli akamai/cli &>/dev/null && akamaicli $@;
fi;
}
configure_command_line_completion() {
(( INTERACTIVE )) || return
local -a enabled=()
# Enable bash programmable completion features in interactive shells
if [ -f /usr/share/bash-completion/bash_completion ]; then
. /usr/share/bash-completion/bash_completion
elif [ -f /etc/bash_completion ]; then
. /etc/bash_completion
elif [ -f /usr/local/etc/bash_completion ]; then
. /usr/local/etc/bash_completion
elif [ -f $(brew --prefix)/etc/bash_completion ]; then
. $(brew --prefix)/etc/bash_completion
fi
if [ -n "${NVM_DIR}" ] && [ -s "${NVM_DIR}/bash_completion" ]; then
. "${NVM_DIR}/bash_completion"
enabled+=("nvm")
fi
# aws command line completion
type -P aws_completer &>/dev/null && enabled+=("aws") && complete -C $(which aws_completer) aws
# terraform command line completion
type -P terraform &>/dev/null && enabled+=("terraform") && complete -C $(which terraform) terraform
# vault command line completion
type -P vault &>/dev/null && enabled+=("vault") && complete -C $(which vault) vault
# consul command line completion
type -P consul &>/dev/null && enabled+=("consul") && complete -C $(which consul) consul
# k3d command line completion
type -P k3d &>/dev/null && enabled+=("k3d") && source <(k3d completion bash)
# helm command line completion
type -P helm &>/dev/null && enabled+=("helm") && source <(helm completion bash)
# kubectl command line completion
type -P kubectl &>/dev/null && enabled+=("kubectl") && source <(kubectl completion bash 2>/dev/null)
# eksctl command line completion
type -P eksctl &>/dev/null && enabled+=("eksctl") && source <(eksctl completion bash)
if (( ${#enabled[@]} )); then
logbashrc " INFO: Command Line Completion Enabled:"
printf "%s\n" "${enabled[@]/#/ - }"
fi
}
get_os_info() {
(( INTERACTIVE )) || return
if [ -f /etc/os-release ]; then
# freedesktop.org and systemd
. /etc/os-release
OS=$NAME
VER=$VERSION_ID
elif type lsb_release >/dev/null 2>&1; then
# linuxbase.org
OS=$(lsb_release -si)
VER=$(lsb_release -sr)
elif [ -f /etc/lsb-release ]; then
# For some versions of Debian/Ubuntu without lsb_release command
. /etc/lsb-release
OS=$DISTRIB_ID
VER=$DISTRIB_RELEASE
elif [ -f /etc/debian_version ]; then
# Older Debian/Ubuntu/etc.
OS=Debian
VER=$(cat /etc/debian_version)
elif [ -f /etc/SuSe-release ]; then
# Older SuSE/etc.
...
elif [ -f /etc/redhat-release ]; then
# Older Red Hat, CentOS, etc.
...
else
# Fall back to uname, e.g. "Linux <version>", also works for BSD, etc.
OS=$(uname -s)
if type -P sw_vers &>/dev/null; then
VER=$(sw_vers -productVersion)
else
VER=$(uname -r)
fi
fi
}
configure_colors() {
# no need for colors if non-interactive
(( INTERACTIVE )) || return
(( DEBUG )) && logbashrc "DEBUG: configuring colors..."
# colored highlighting is awesome, enable if available
if type dircolors &>/dev/null; then
if [ ! -f "~/.dir_colors" ]; then
(( DEBUG )) && logbashrc "DEBUG: generating dir colors"
if brew list gnu-sed &>/dev/null && [[ $PATH =~ gnu-sed\/libexec\/gnubin ]]; then
dircolors -p | sed '/# directory/c DIR 01;33 # directory for dark theme' > ~/.dir_colors
else
dircolors -p | sed -E 's@DIR.*directory@DIR 01;33 # directory for dark theme@' > ~/.dir_colors
fi
fi
(( DEBUG )) && logbashrc "DEBUG: loading colors"
eval "`dircolors -b ~/.dir_colors`"
elif [ "${OS}" == "Darwin" ]; then
export LSCOLORS='DxGxcxdxCxcgcdabagacad'
export CLICOLOR=1
else
export LS_COLORS='rs=0:di=01;33:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:';
fi
# Color for manpages in less makes manpages a little easier to read
export LESS_TERMCAP_mb=$'\E[01;31m'
export LESS_TERMCAP_md=$'\E[01;31m'
export LESS_TERMCAP_me=$'\E[0m'
export LESS_TERMCAP_se=$'\E[0m'
export LESS_TERMCAP_so=$'\E[01;44;33m'
export LESS_TERMCAP_ue=$'\E[0m'
export LESS_TERMCAP_us=$'\E[01;32m'
}
# command_prompt()
#
# Function that is executed each time a command is run to update the PS1
# variable (ie: prompt). To configure, let's put some fonts in place.
# Download and install Gabriele Lana's Awesome Fonts:
#
# https://github.com/gabrielelana/awesome-terminal-fonts/archive/master.zip
#
# Unzip the archive and run the install.sh from the resulting
# awesome-terminal-fonts-master folder to install some fonts. Some .sh files
# will also be installed in ~/.fonts to provide constants for each font that
# can be used in scripts.
#
# If using git, install the git-prompt.sh script in your home folder and add
# to .bashrc:
#
# curl -L -o ~/.git-prompt.sh https://raw.githubusercontent.com/git/git/master/contrib/completion/git-prompt.sh
# chown +x ~/.git-prompt.sh
# echo 'source ~/.git-prompt.sh' >> ~/.bashrc
#
# You'll need to log out and back in to pull that in, or you'll need to source
# the ~/.git-prompt.sh in your current session to test it.
#
# Color scheme is based on a dark background. If using a light background,
# you'll want to experiment with the colors.
command_prompt() {
#=========================================================
# Capture EXIT_CODE MUST BE FIRST!!!
#=========================================================
local EXIT_CODE="$?"
[[ $- =~ i ]] || return
local debug=0
local prompt_var="PS1" && PS1=""
(( EUID == 0 )) && prompt_var="SUDO_PS1" && SUDO_PS1=""
# exit code output variables
local exit_code=""
local exit_code_color=""
# CONSTANTS
# Colors for bash prompt
# foreground colors, use with echo -e
local RESET='\[\e[m\]' # No Color, reset
# normal bright high intensity bright + high intensity
local DKGREY='\[\e[0;30m\]'
local LTGREY='\[\e[1;30m\]'
local RED='\[\e[0;31m\]' BRED='\[\e[1;31m\]' IRED='\[\e[0;91m\]' BIRED='\[\e[1;91m\]'
local GREEN='\[\e[0;32m\]' BGREEN='\[\e[1;32m\]' IGREEN='\[\e[0;92m\]' BIGREEN='\[\e[1;92m\]'
local YELLOW='\[\e[0;33m\]' BYELLOW='\[\e[1;33m\]' IYELLOW='\[\e[0;93m\]' BIYELLOW='\[\e[1;93m\]'
local BLUE='\[\e[0;34m\]' BBLUE='\[\e[1;34m\]' IBLUE='\[\e[0;94m\]' BIBLUE='\[\e[1;94m\]'
local PURPLE='\[\e[0;35m\]' BPURPLE='\[\e[1;35m\]' IPURPLE='\[\e[0;95m\]' BIPURPLE='\[\e[1;95m\]'
local CYAN='\[\e[0;36m\]' BCYAN='\[\e[1;36m\]' ICYAN='\[\e[0;96m\]' BICYAN='\[\e[1;96m\]'
local GREY='\[\e[0;37m\]' BGREY='\[\e[1;37m\]'
local WHITE='\[\e[0;97m\]' BWHITE='\[\e[1;97m\]'
local sym_radioactive=$(echo -e '\u2622')
local sym_warning=$(echo -e '\u26A0')
local sym_check_mark=$(echo -e '\u2714')
local sym_cancel=$(echo -e '\u2718')
local sym_sparkle="$(echo -e '\u2728')"
local sym_arrow="$(echo -e '\u2937')"
local sym_line="$(echo -e '\u2574')"
local sym_left_arrow_up="$(echo -e '\u2b11')"
local sym_background_process="$(echo -e '\u2749')"
local sym_colon="$(echo -e '\u003A')"
local user="${CYAN}\u${RESET}"
(( EUID == 0 )) && user="${RED}\u${RESET}"
local host="${ICYAN}\h${RESET}"
local workdir="${YELLOW}\W${RESET}"
# is user in an SSH session?
local bracket_color="" # default
if [[ $SSH_CLIENT ]] || [[ $SSH2_CLIENT ]]; then
bracket_color="${BPURPLE}"
fi
local info_bracket_color="${LTGREY}"
local git_branch=""
local git_symbols=""
# check if user has ~/.git-prompt.sh loaded and run
# __git_ps1 if possible
local git_ps1=""
if declare -F __git_ps1 &>/dev/null; then
git_ps1=$(__git_ps1)
git_ps1="${git_ps1//[(]}"
git_ps1="${git_ps1//[]]}"
git_ps1="${git_ps1//[)]}"
if [ -n "${git_ps1}" ]; then
git_ps1="${git_ps1##*( )}"
# colour branch name depending on state
# make the symbols easier to see.
local git_branch_color="${BIGREY}"
# staged files, committed but not pushed
if [[ "${git_ps1}" =~ "+" ]]; then
git_branch_color="${CYAN}"
git_ps1="${git_ps1//[+]}"
git_symbols+=" ${CYAN}staged${RESET}"
fi
# if there is something stashed
if [[ "${git_ps1}" =~ "$" ]]; then
git_branch_color="${GREEN}"
git_ps1="${git_ps1//[$]}"
git_symbols+=" ${GREEN}stashed${RESET}"
fi
# unstaged/uncommitted files (dirty)
if [[ "${git_ps1}" =~ "*" ]]; then
git_branch_color="${YELLOW}"
git_ps1="${git_ps1//[*]}"
git_symbols+=" ${YELLOW}unstaged${RESET}"
fi
# branch is diverged
if [[ "${git_ps1}" =~ "<>" ]]; then
git_branch_color="${RED}"
git_ps1="${git_ps1//[<>]}"
git_symbols+=" ${RED}diverged${RESET}"
# branch is ahead
elif [[ "${git_ps1}" =~ ">" ]]; then
git_branch_color="${YELLOW}"
git_ps1="${git_ps1//[>]}"
git_symbols+=" ${YELLOW}ahead${RESET}"
# branch is behind
elif [[ "${git_ps1}" =~ "<" ]]; then
git_branch_color="${YELLOW}"
git_ps1="${git_ps1//[<]}"
git_symbols+=" ${YELLOW}behind${RESET}"
fi
# untracked files
if [[ "${git_ps1}" =~ "%" ]]; then
git_branch_color="${RED}"
git_ps1="${git_ps1//[%]}"
git_symbols+=" ${RED}untracked${RESET}"
fi
# no changes
if [ -z "${git_symbols}" ]; then
git_symbols=" up-to-date"
fi
git_ps1="${git_ps1//=} ${info_bracket_color}=>${RESET}"
git_branch="${info_bracket_color}[[${RESET}${git_branch_color}${git_ps1}${RESET}"
git_branch+="${git_symbols}${RESET}${info_bracket_color}]]${RESET}"
fi
fi
local terraform_workspace=""
if [ -f ".terraform/environment" ]; then
[ -n "${TF_WORKSPACE}" ] && terraform_workspace=${TF_WORKSPACE} || terraform_workspace=$(cat .terraform/environment)
local terraform_workspace_color="${BIGREY}"
case ${terraform_workspace} in
*dev*|*qa*|*test*) terraform_workspace_color=${CYAN};;
*uat*|*stag*) terraform_workspace_color=${YELLOW};;
*prd*|*prod*) terraform_workspace_color=${YELLOW};;
*) terraform_workspace_color=${GREEN};;
esac
terraform_workspace="${info_bracket_color}<<${RESET}${terraform_workspace_color}${terraform_workspace}${RESET}"
terraform_workspace+="${info_bracket_color}>>${RESET}"
fi
local kube_context=""
if type -P kubectl &>/dev/null; then
if [ -f "${HOME}/.kube/config" ] || [ -n "${KUBECONFIG}" ]; then
kube_context=$(kubectl config current-context 2>/dev/null)
local kube_context_color="${BIGREY}"
if kubectl config current-context 2>&1 | grep -q "connection refused"; then
kube_context+="(${RED}DOWN${BIGREY})"
else
case ${kube_context} in
*dev*|*qa*|*test*|*nonprod*) kube_context_color=${CYAN};;
*uat*|*stag*) kube_context_color=${YELLOW};;
*prod*) kube_context_color=${YELLOW};;
esac
fi
kube_context="${info_bracket_color}{k8s:${RESET}${kube_context_color}${kube_context}${RESET}${info_bracket_color}}${RESET}"
fi
fi
case ${EXIT_CODE} in
0) exit_code="${sym_check_mark}"
exit_code_color="${BGREEN}"
;;
127) exit_code="${sym_warning}" # command not found
exit_code_color="${BIRED}"
;;
130) exit_code="${sym_cancel}" # control-c
exit_code_color="${BYELLOW}"
;;
148) exit_code="${sym_sparkle}" # backgrounded command
exit_code_color="${BCYAN}"
;;
*) exit_code="${EXIT_CODE}" # other error code
exit_code_color="${RED}"
;;
esac
# backgrounded and paused jobs in the current session.
local jobs_details=""
local bg_jobs=$(jobs -r | wc -l )
(( bg_jobs > 0 )) && jobs_details="${YELLOW}${sym_background_process}${RESET}${sym_colon}${WHITE}${bg_jobs}${RESET} "
(( bg_jobs > 3 )) && jobs_details="${RED}${sym_background_process}${RESET}${sym_colon}${WHITE}${bg_jobs}${RESET} "
local st_jobs=$(jobs -s | wc -l )
(( st_jobs > 0 )) && (( st_jobs <= 3 )) && jobs_details+="${GREY}${sym_background_process}${RESET}${sym_colon}${WHITE}${st_jobs}${RESET}"
(( st_jobs > 3 )) && jobs_details+="${GREY}${sym_background_process}${RESET}${sym_colon}${WHITE}${st_jobs}${RESET}"
# assemble the prompt
local prompt=""
[ -n "${kube_context}" ] && prompt+="${kube_context}" && (( debug )) && echo "$LINENO: kube_context: $kube_context"
[ -n "${git_branch}" ] && prompt+="${git_branch}" && (( debug )) && echo "$LINENO: git_branch set"
[ -n "${terraform_workspace}" ] && { [ -n "${prompt}" ] && prompt+=" "; prompt+="${terraform_workspace}"; (( debug )) && echo "terraform_workspace set"; }
[ -n "${jobs_details}" ] && { [ -n "${prompt}" ] && prompt+=" "; prompt+="${jobs_details}"; (( debug )) && echo "job_details set"; }
[ -n "${prompt}" ] && prompt+="\n"
prompt+="${GREY}${sym_arrow} ${RESET}"
prompt+="${exit_code_color}${exit_code} ${RESET}"
prompt+="${bracket_color}[${RESET}${user}@${host}${bracket_color}][${RESET}${workdir}${bracket_color}]${RESET}$ "
#(( EUID == 0 )) && SUDO_PS1=$prompt || PS1=$prompt
PS1=$prompt
}
configure_ps1() {
(( INTERACTIVE )) || return
# configure PROMPT_COMMAND which is executed each time before PS1
export PROMPT_COMMAND='command_prompt; history -a; history -c; history -r;'
}
configure_aliases() {
# no need for aliases if non-interactive
(( INTERACTIVE )) || return
export CMD_OPTS="--color=auto"
export LS_OPTS="-F ${CMD_OPTS}"
# set aliases if unset
## Colorize the ls output ##
alias ls &>/dev/null || alias ls="$(which ls) ${LS_OPTS}"
## Use a long listing format ##
alias ll &>/dev/null || alias ll="$(which ls) -la ${LS_OPTS}"
## Show hidden files ##
alias l. &>/dev/null || alias l.="$(which ls) -d .* ${LS_OPTS}"
alias dir &>/dev/null || alias dir="$(which ls) --format=vertical ${LS_OPTS}"
alias vdir &>/dev/null || alias vdir="$(which ls) --format=long ${LS_OPTS}"
alias grep &>/dev/null || alias grep="$(which grep) ${CMD_OPTS}"
alias fgrep &>/dev/null || alias fgrep="$(which fgrep) ${CMD_OPTS}"
alias egrep &>/dev/null || alias egrep="$(which egrep) ${CMD_OPTS}"
# Terraform
alias tf &>/dev/null || alias tf="terraform"
alias tf12 &>/dev/null || alias tf="terraform12"
# Show current network connections to servers
alias ipview="netstat -anpl | grep :80 | awk {'print \$5'} | cut -d\":\" -f1 | sort | uniq -c | sort -n | sed -e 's/^ *//' -e 's/ *\$//'"
# Show local open listeners
alias openports='netstat -nape --inet'
# Weather
alias weather &>/dev/null || alias weather="curl http://wttr.in/"
# Public IP
alias whatismyip="dig +short myip.opendns.com @resolver1.opendns.com"
# TfSwitch
alias tfswitch="tfswitch --bin=$HOME/bin/terraform"
if [ "${OS}" == "Linux" ]; then
alias ubupdate="sudo apt update && sudo apt dist-upgrade -y --auto-remove"
fi
}
configure_git() {
# no need for bash completion or branch in prompt if non-interactive
(( INTERACTIVE )) || return
local git_prompt_sh=""
# Git
if type git &>/dev/null; then
if [ ! "$(git config --global credential.helper)" == "cache" ]; then
git config --global credential.helper 'cache --timeout=3600' ${git_credential_type}
alias gitdisablecache="git config --global --unset credential.helper"
fi
if [ -f /usr/lib/git-core/git-sh-prompt ]; then
git_prompt_sh="/usr/lib/git-core/git-sh-prompt"
else
git_prompt_sh="${HOME}/.git-prompt.sh"
if [ ! -f "${git_prompt_sh}" ]; then
logbashrc " INFO: git-prompt.sh not found, installing... this is only needed once..."
curl -sL -o "${git_prompt_sh}" "https://raw.githubusercontent.com/git/git/master/contrib/completion/git-prompt.sh"
chmod +x "${git_prompt_sh}"
fi
fi
# if .git-prompt.sh exists, set options and execute it
if [ -n "${git_prompt_sh}" ]; then
GIT_PS1_SHOWDIRTYSTATE=true # this can get sluggish for large repositories
GIT_PS1_SHOWUNTRACKEDFILES=true # this runs a git ls-files command and can be rather sluggish
GIT_PS1_SHOWSTASHSTATE=true
GIT_PS1_SHOWUPSTREAM="auto"
GIT_PS1_HIDE_IF_PWD_IGNORED=true
GIT_PS1_SHOWCOLORHINTS=true
GIT_PS1_STATESEPARATOR=""
. "${git_prompt_sh}"
fi
fi
}
configure_path() {
local work_dir
local -a bin_vers=()
# Configure common paths
if [ "${OS}" == "Darwin" ]; then
local homebrew_prefix="/usr/local"
if [ -d "${HOME}/homebrew" ]; then
homebrew_prefix="${HOME}/homebrew"
if [ -d "${HOME}/Applications/brewApps" ]; then
export HOMEBREW_CASK_OPTS="--appdir=${HOME}/Applications/brewApps"
fi
elif [ "${MACHINE_ARCH}" == "arm64" ]; then
homebrew_prefix="/opt/homebrew"
fi
if [ -d "${homebrew_prefix}/bin" ]; then
export HOMEBREW_PREFIX="${homebrew_prefix}"
export HOMEBREW_REPOSITORY="${HOMEBREW_PREFIX}"
export HOMEBREW_CELLAR="${HOMEBREW_PREFIX}/Cellar"
pathadd -p "${HOMEBREW_PREFIX}/bin"
pathadd "${HOMEBREW_PREFIX}/share/man" "MANPATH"
pathadd "${HOMEBREW_PREFIX}/share/info" "INFOPATH"
# Core Utils, if installed
work_dir="${HOMEBREW_PREFIX}/opt/coreutils/libexec/gnubin"
pathadd -p "${work_dir}" && pathadd -p "${work_dir%/*}/gnuman" "MANPATH"
# GNU Diff Utils, if installed
work_dir="${HOMEBREW_PREFIX}/opt/diffutils/bin"
pathadd -p "${work_dir}" && pathadd -p "${work_dir%/*}/share/man" "MANPATH"
# GNU Tar, if installed
work_dir="${HOMEBREW_PREFIX}/opt/gnu-tar/libexec/gnubin"
pathadd -p "${work_dir}" && pathadd -p "${work_dir%/*}/gnuman" "MANPATH"
# Python installed by brew
work_dir="${HOMEBREW_PREFIX}/opt/python/libexec/bin"
pathadd -p "${work_dir}" && pathadd -p "${work_dir%/*}/share/man" "MANPATH"
# Ruby installed by brew
work_dir="${HOMEBREW_PREFIX}/opt/ruby/bin"
pathadd -p "${work_dir}" && pathadd -p "${work_dir%/*}/share/man" "MANPATH"
bin_vers+=("$(ruby --version | awk '{printf "%s %s\n", $1, $2}')")
fi
# Maven, if installed
export MAVEN_HOME=/usr/local/apache-maven
pathadd "${MAVEN_HOME}/bin" || unset MAVEN_HOME
# Android Debug Bridge
work_dir=$(readlink -f ~/Applications/platform-tools)
pathadd -p "${work_dir}"
git_credential_type="osxkeychain"
else
# Android Debug Bridge
work_dir=/opt/local/platform-tools
pathadd -p "${work_dir}"
export LOCAL_BIN=~/.local/bin
pathadd "${LOCAL_BIN}" || unset LOCAL_BIN
fi
# Python Config
if type -P python3 &>/dev/null; then
if [ ! "$(readlink -f $(type -P python))" == "$(readlink -f $(type -P python3))" ]; then
logbashrc " INFO: default python is not python3, setting alias to python3."
alias python="python3"
fi
fi
type -P python &>/dev/null && bin_vers+=("$(python --version)")
# NVM
if [ -d "${HOME}/.nvm" ]; then
export NVM_DIR="$HOME/.nvm"
[ -s "${NVM_DIR}/nvm.sh" ] && . "${NVM_DIR}/nvm.sh" # This loads nvm
logbashrc " INFO: Node version loaded from nvm: $(nvm version)"
fi
# MySQL, if installed
work_dir=/usr/local/mysql/bin
pathadd "${work_dir}"
export GOROOT=/usr/local/go
pathadd "${GOROOT}/bin" && bin_vers+=("$(go version | awk '{print $3}' | sed 's/go\(.*\)/go \1/g')") || unset GOROOT
pathadd "${HOME}/bin"
pathdedup
pathdedup MANPATH
pathdedup INFOPATH
if (( ${#bin_vers[@]} > 0 )); then
logbashrc " INFO: Installed tools:"
for v in "${bin_vers[@]}"; do
logbashrc " - $v"
done
fi
}
INTERACTIVE=0
MACHINE_ARCH=$(uname -m)
init_bash() {
# Set INTERACTIVE to 1 if interactive, otherwise 0
[[ $- =~ i ]] && INTERACTIVE=1
get_os_info
# Disable the bell in interactive shell
if (( INTERACTIVE )); then
MACHINE_TYPE="host"
if [ "${OS}" == "Darwin" ]; then
ioreg -l | grep -q -E "Manufacturer" | grep -E "VirtualBox|Oracle|VMware|Parallels" && MACHINE_TYPE="vm"
else
grep -q '^flags.*\ hypervisor\ ' /proc/cpuinfo && MACHINE_TYPE="vm"
fi
logbashrc "Initializing ${MACHINE_TYPE}"
bind "set bell-style visible"
[[ $SSH_CLIENT ]] || [[ $SSH2_CLIENT ]] && REMOTE=1 || REMOTE=0
[ -n "${LANG}" ] || export LANG="en_US.UTF-8"
# Get DPI of screen
if type -P xrandr &>/dev/null && [ "${MACHINE_TYPE}" == "host" ] && (( REMOTE == 0 )); then
read -r X Y < <(xrandr | grep -w connected | awk '{print $(NF-2)" "$(NF)}')
X="${X//[[:alpha:]]}"
Y="${Y//[[:alpha:]]}"
fi
read -r ROWS COLUMNS < <(stty size)
[ -z "$COLUMNS" ] && COLUMNS=140
# Make bash check it's window size after a process completes
shopt -s checkwinsize
# Make bash fix common folder name spelling mistakes (ect vs. etc)
shopt -s cdspell
## History settings
# Expand the history size
export HISTFILESIZE=20000
export HISTSIZE=5000
# Don't put duplicate lines in the history and do not add lines that start with a space
export HISTCONTROL=erasedups:ignoredups:ignorespace
# Set the default editor
type vim &>/dev/null && export EDITOR=vim || export EDITOR=vi
export VISUAL=$EDITOR
fi
configure_path
configure_colors
configure_command_line_completion
configure_aliases
configure_git
configure_ps1
# remove bashrc functions from env to avoid clutter
unset -f pathdedup
unset -f pathadd
unset -f get_os_info
unset -f configure_colors
unset -f configure_command_line_completion
unset -f configure_aliases
unset -f configure_git
unset -f configure_ps1
unset -f configure_path
unset -f logbashrc
(( INTERACTIVE )) || { echo "unsetting command_prompt"; unset -f command_prompt; }
unset INTERACTIVE
unset MACHINE_TYPE
unset MACHINE_ARCH
}
init_bash
unset -f init_bash
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment