#!/bin/bash # ~/.bashrc: executed by bash(1) for non-login shells. # A basically sane bash environment. # Tony Duckles (based on http://github.com/rtomayko/dotfiles) # the basics : ${HOME=~} : ${LOGNAME=$(id -un)} : ${UNAME=$(uname)} # strip OS type and version under Cygwin (e.g. CYGWIN_NT-5.1 => Cygwin) UNAME=${UNAME/CYGWIN_*/Cygwin} # complete hostnames from this file HOSTFILE=~/.ssh/known_hosts # readline config INPUTRC=~/.inputrc if [ "$UNAME" = "Darwin" ]; then # Fink init, for OSX test -r /sw/bin/init.sh && source /sw/bin/init.sh fi # ---------------------------------------------------------------------- # SHELL OPTIONS # ---------------------------------------------------------------------- # bring in system bashrc test -r /etc/bashrc && . /etc/bashrc # notify of bg job completion immediately set -o notify # shell opts. see bash(1) for details shopt -s cdspell >/dev/null 2>&1 shopt -s extglob >/dev/null 2>&1 shopt -s histappend >/dev/null 2>&1 shopt -s hostcomplete >/dev/null 2>&1 shopt -s interactive_comments >/dev/null 2>&1 shopt -u mailwarn >/dev/null 2>&1 shopt -s no_empty_cmd_completion >/dev/null 2>&1 # don't check for new mail unset MAILCHECK # disable core dumps ulimit -S -c 0 # default umask umask 0022 # ---------------------------------------------------------------------- # PATH # ---------------------------------------------------------------------- # we want the various sbins on the path along with /usr/local/bin PATH="$PATH:/usr/local/sbin:/usr/sbin:/sbin" PATH="/usr/local/bin:$PATH" # put ~/bin on PATH if you have it test -d "$HOME/bin" && PATH="$HOME/bin:$PATH" # ---------------------------------------------------------------------- # ENVIRONMENT CONFIGURATION # ---------------------------------------------------------------------- # detect interactive shell case "$-" in *i*) INTERACTIVE=yes ;; *) unset INTERACTIVE ;; esac # detect login shell case "$0" in -*) LOGIN=yes ;; *) unset LOGIN ;; esac # enable en_US locale w/ utf-8 encodings if not already # configured : ${LANG:="en_US.UTF-8"} : ${LANGUAGE:="en"} : ${LC_CTYPE:="en_US.UTF-8"} : ${LC_ALL:="en_US.UTF-8"} export LANG LANGUAGE LC_CTYPE LC_ALL # ignore backups, CVS directories, python bytecode, vim swap files FIGNORE="~:CVS:#:.pyc:.swp:.swa:apache-solr-*" HISTCONTROL=ignoreboth # ---------------------------------------------------------------------- # PAGER / EDITOR # ---------------------------------------------------------------------- # See what we have to work with ... HAVE_VIM=$(command -v vim) # EDITOR test -n "$HAVE_VIM" && EDITOR=vim || EDITOR=vi export EDITOR # PAGER if test -n "$(command -v less)" ; then PAGER="less -FirSwX" MANPAGER="less -FiRswX" else PAGER=more MANPAGER="$PAGER" fi export PAGER MANPAGER # ---------------------------------------------------------------------- # PROMPT # ---------------------------------------------------------------------- # http://en.wikipedia.org/wiki/ANSI_escape_code#graphics SGR_RED="\[\033[1;31m\]" SGR_GREEN="\[\033[0;32m\]" SGR_BROWN="\[\033[0;33m\]" SGR_YELLOW="\[\033[1;33m\]" SGR_GREY="\[\033[0;37m\]" SGR_WHITE="\[\033[1;37m\]" SGR_BLUE="\[\033[1;34m\]" SGR_RESET="\[\033[0m\]" if [ "$UID" = 0 ]; then # root PS_COLOR1="${SGR_RED}" PS_COLOR2="" PS_P="#" else if [ "$UNAME" = "Cygwin" ]; then PS_COLOR1="${SGR_GREEN}" PS_COLOR2="" else PS_COLOR1="${SGR_BROWN}" PS_COLOR2="${SGR_YELLOW}" fi PS_P="\$" fi prompt_simple() { unset PROMPT_COMMAND PS1="[\u@\h:\w]\$ " PS2="> " } prompt_compact() { unset PROMPT_COMMAND PS1="${PS_COLOR1}${PS_P}${SGR_RESET} " PS2="> " } prompt_color() { PS1="[${PS_COLOR1}\u@\h${SGR_RESET}:${PS_COLOR2}\w${SGR_RESET}]${PS_P} " PS2="> " } # ---------------------------------------------------------------------- # MACOS X / DARWIN SPECIFIC # ---------------------------------------------------------------------- if [ "$UNAME" = Darwin ]; then # put ports on the paths if /opt/local exists test -x /opt/local -a ! -L /opt/local && { PORTS=/opt/local # setup the PATH and MANPATH PATH="$PORTS/bin:$PORTS/sbin:$PATH" MANPATH="$PORTS/share/man:$MANPATH" # nice little port alias alias port="sudo nice -n +18 $PORTS/bin/port" } fi # ---------------------------------------------------------------------- # ALIASES / FUNCTIONS # ---------------------------------------------------------------------- # alias 'vi' to 'vim' if Vim is installed vim="$(type -P vim)" test -n "$vim" && { alias vi='vim' } unset vim # disk usage with human sizes and minimal depth alias du1='du -h --max-depth=1' alias fn='find . -name' alias hi='history | tail -20' # ---------------------------------------------------------------------- # BASH COMPLETION # ---------------------------------------------------------------------- test -z "$BASH_COMPLETION" && { bash=${BASH_VERSION%.*}; bmajor=${bash%.*}; bminor=${bash#*.} test -n "$PS1" && test $bmajor -gt 1 && { # search for a bash_completion file to source for f in /usr/local/etc/bash_completion \ /usr/pkg/etc/bash_completion \ /opt/local/etc/bash_completion \ /etc/bash_completion do test -f $f && { . $f break } done } unset bash bmajor bminor } # override and disable tilde expansion _expand() { return 0 } # ---------------------------------------------------------------------- # LS AND DIRCOLORS # ---------------------------------------------------------------------- # we always pass these to ls(1) unset LS_COMMON ## OS-specific options #case "$UNAME" in # "Linux" ) LS_COMMON="--color=auto";; # "Cygwin" ) LS_COMMON="--color=auto";; # "Darwin" ) LS_COMMON="--color=auto";; #esac # if the dircolors utility is available, set that up for ls dircolors="$(type -P gdircolors dircolors | head -1)" test -n "$dircolors" && { COLORS=/etc/DIR_COLORS test -e "/etc/DIR_COLORS.$TERM" && COLORS="/etc/DIR_COLORS.$TERM" test -e "$HOME/.dircolors" && COLORS="$HOME/.dircolors" test ! -e "$COLORS" && COLORS= eval `$dircolors --sh $COLORS` } unset dircolors # enable color ls output if available test -n "$COLORS" && LS_COMMON="--color=auto $LS_COMMON" # setup the main ls alias if we've established common args test -n "$LS_COMMON" && alias ls="command ls $LS_COMMON" # these use the ls aliases above alias ll="ls -l" alias l.="ls -d .*" alias ll.="ls -ld .*" # setup color grep output if available test -n "$COLORS" && alias grep="command grep --color=auto" # -------------------------------------------------------------------- # MISC COMMANDS # -------------------------------------------------------------------- # push SSH public key to another box push_ssh_cert() { local _host test -f ~/.ssh/id_dsa.pub || ssh-keygen -t dsa for _host in "$@"; do echo $_host ssh $_host 'cat >> ~/.ssh/authorized_keys2' < ~/.ssh/id_dsa.pub done } # -------------------------------------------------------------------- # PATH MANIPULATION FUNCTIONS # -------------------------------------------------------------------- # Usage: pls [] # List path entries of PATH or environment variable . pls () { eval echo \$${1:-PATH} |tr : '\n'; } # Usage: pshift [-n ] [] # Shift entries off the front of PATH or environment var . # with the option. Useful: pshift $(pwd) pshift () { local n=1 [ "$1" = "-n" ] && { n=$(( $2 + 1 )); shift 2; } eval "${1:-PATH}='$(pls |tail -n +$n |tr '\n' :)'" } # Usage: ppop [-n ] [] # Pop entries off the end of PATH or environment variable . ppop () { local n=1 i=0 [ "$1" = "-n" ] && { n=$2; shift 2; } while [ $i -lt $n ] do eval "${1:-PATH}='\${${1:-PATH}%:*}'" i=$(( i + 1 )) done } # Usage: prm [] # Remove from PATH or environment variable . prm () { eval "${2:-PATH}='$(pls $2 |grep -v "^$1\$" |tr '\n' :)'"; } # Usage: punshift [] # Shift onto the beginning of PATH or environment variable . punshift () { eval "${2:-PATH}='$1:$(eval echo \$${2:-PATH})'"; } # Usage: puniq [] # Remove duplicate entries from a PATH style value while retaining # the original order. Use PATH if no is given. # # Example: # $ puniq /usr/bin:/usr/local/bin:/usr/bin # /usr/bin:/usr/local/bin puniq () { echo "$1" | tr : '\n' | nl | sort -u -k 2,2 | sort -n | cut -f 2- | tr '\n' : | sed -e 's/:$//' -e 's/^://' } # ------------------------------------------------------------------- # USER SHELL ENVIRONMENT # ------------------------------------------------------------------- # source ~/.shenv now if it exists test -r ~/.shenv && . ~/.shenv # condense PATH entries PATH=$(puniq $PATH) MANPATH=$(puniq $MANPATH) # Use the color prompt by default when interactive test -n "$PS1" && prompt_color # vim: ts=4 sts=4 shiftwidth=4 expandtab