My configuration for bash, vim, git, tmux and a few other tools can be found on GitHub now.
I have spent a considerable amount of time to get them working on OS X and Linux.
(Tested on Mac OS X Yosemite 10.10.3 and Debian 7.8 – YMMV!)
Tag: bashrc
Set tmux pane title on SSH connections
I am frequently connecting to several servers over SSH at once and like to use tmux to organize those different sessions. To be able to keep track which pane is which server I am using the following function in my .bashrc file to display the machine name in tmux’s pane title.
https://gist.github.com/florianbeer/ee02c149a7e25f643491
Waiting for a server
Today two of my servers went down. It turned out, that the datacenter they are hosted in had a slight connectivity hiccup – nothing serious. While I was battling my monitoring system and frantically typed support tickets, I wanted an audible alert if the hosts where reachable again in the meantime.
That’s when I thought of OS X’s text to speech system and devised the following little shell script.
https://gist.github.com/florianbeer/8c1e0a56bc306d603987
It will announce that the host is back up with your configured standard voice as soon as there is a ping response and then quit. Just copy it in your .bashrc file call it with the desired hostname or IP address, leave it running in a Terminal window in the background and turn up your speakers.
hostup no-panic.at
My Bash configuration
Update: You can now find all of my .dotfiles on GitHub.
Find below my “.bash_profile" file in OS X Lion and the referenced “.bash_ps1" (slightly modified from lifehacker).
Detailed walkthrough
- add some additional directories to PATH
- reference .bash_ps1 (see the file below)
- set grep and ls to display some fancy colors
- two aliases to often used commands
- order top by CPU usage
- display more human readable directory listing output
- Set Textmate’s “mate” command as the default editor
- Ignore duplicates in history. E. g. if I issue “ls” multiple times, it only occurs once when I press the cursor up key, to cycle through my last commands.
- Export DISPLAY environment variable if it’s not already set. This helps with X-forwarding from remote systems.
- SSH host completion lets me type the first few characters of any host I already connected to successfully and completes it just like normal shell commands or files after pressing TAB.
- The “myip” function lets me look up my external IP.
- “git_stats” spits out detailed infos about any git repository you issue this command in.
.bash_profile
export PATH=$PATH:~/bin:/usr/local/bin:/usr/local/sbin:/usr/local/git/bin
# set fancy prompt
if [ -f "$HOME/.bash_ps1" ]; then
. "$HOME/.bash_ps1"
fi
# some settings to be more colorful
export GREP_OPTIONS='--color=auto' GREP_COLOR='1;32'
export CLICOLOR=true
export LSCOLORS=ExGxFxdxCxDxDxBxBxExEx
# handy aliases
alias top='top -o cpu'
alias ll='ls -lh'
# use Textmate as default editor
export EDITOR="mate"
# no duplicates in bash history
export HISTCONTROL=ignoredups
# export DISPLAY if it's not set yet
[[ -z $DISPLAY ]] && export DISPLAY=":0.0"
# ssh host tab completion
complete -W "$(echo `cat ~/.ssh/known_hosts | cut -f 1 -d ' ' | sed -e s/,.*//g | uniq | grep -v "\["`;)" ssh
################################################
# bash functions
################################################
function myip {
res=$(curl -s checkip.dyndns.org | grep -Eo '[0-9\.]+')
echo "$res"
}
function git_stats {
# awesome work from https://github.com/esc/git-stats
# including some modifications
if [ -n "$(git symbolic-ref HEAD 2> /dev/null)" ]; then
echo "Number of commits per author:"
git --no-pager shortlog -sn --all
AUTHORS=$( git shortlog -sn --all | cut -f2 | cut -f1 -d' ')
LOGOPTS=""
if [ "$1" == '-w' ]; then
LOGOPTS="$LOGOPTS -w"
shift
fi
if [ "$1" == '-M' ]; then
LOGOPTS="$LOGOPTS -M"
shift
fi
if [ "$1" == '-C' ]; then
LOGOPTS="$LOGOPTS -C --find-copies-harder"
shift
fi
for a in $AUTHORS
do
echo '-------------------'
echo "Statistics for: $a"
echo -n "Number of files changed: "
git log $LOGOPTS --all --numstat --format="%n" --author=$a | cut -f3 | sort -iu | wc -l
echo -n "Number of lines added: "
git log $LOGOPTS --all --numstat --format="%n" --author=$a | cut -f1 | awk '{s+=$1} END {print s}'
echo -n "Number of lines deleted: "
git log $LOGOPTS --all --numstat --format="%n" --author=$a | cut -f2 | awk '{s+=$1} END {print s}'
echo -n "Number of merges: "
git log $LOGOPTS --all --merges --author=$a | grep -c '^commit'
done
else
echo "you're currently not in a git repository"
fi
}
.bash_ps
############################################
# Modified from emilis bash prompt script
# from https://github.com/emilis/emilis-config/blob/master/.bash_ps1
###########################################
fill="--- "
reset_style='\[\033[00m\]'
status_style=$reset_style'\[\033[0;90m\]' # gray color; use 0;37m for lighter color
prompt_style=$reset_style
command_style=$reset_style'\[\033[1;29m\]' # bold black
PS1="$status_style"'$fill \t\n'"$prompt_style"'${debian_chroot:+($debian_chroot)}\[\033[0;32m\]::>'"$command_style "
# this is invoked every time before a command is executed
trap 'echo -ne "\033[00m"' DEBUG
function prompt_command {
let fillsize=${COLUMNS}-9
fill=""
while [ "$fillsize" -gt "0" ]
do
fill="-${fill}" # fill with underscores to work on
let fillsize=${fillsize}-1
done
}
export PROMPT_COMMAND=prompt_command
