Skip to content
Snippets Groups Projects
bashrc 12.4 KiB
Newer Older
  • Learn to ignore specific revisions
  • #!/bin/bash
    iatest=$(expr index "$-" i)
    
    #######################################################
    # SOURCED ALIAS'S AND SCRIPTS BY zachbrowne.me
    #######################################################
    
    # Source global definitions
    if [ -f /etc/bashrc ]; then
    	 . /etc/bashrc
    fi
    
    # 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
    fi
    
    #######################################################
    # EXPORTS
    #######################################################
    
    # Disable the bell
    if [[ $iatest > 0 ]]; then bind "set bell-style visible"; fi
    
    # Expand the history size
    export HISTFILESIZE=10000
    export HISTSIZE=500
    
    # Don't put duplicate lines in the history and do not add lines that start with a space
    export HISTCONTROL=erasedups:ignoredups:ignorespace
    
    # Check the window size after each command and, if necessary, update the values of LINES and COLUMNS
    shopt -s checkwinsize
    
    # Causes bash to append to history instead of overwriting it so if you start a new terminal, you have old session history
    shopt -s histappend
    PROMPT_COMMAND='history -a'
    
    # Allow ctrl-S for history navigation (with ctrl-R)
    stty -ixon
    
    # Ignore case on auto-completion
    # Note: bind used instead of sticking these in .inputrc
    if [[ $iatest > 0 ]]; then bind "set completion-ignore-case on"; fi
    
    # Show auto-completion list automatically, without double tab
    if [[ $iatest > 0 ]]; then bind "set show-all-if-ambiguous On"; fi
    
    # Set the default editor
    export EDITOR=vim
    export VISUAL=vim
    alias pico='edit'
    alias spico='sedit'
    alias nano='edit'
    alias snano='sedit'
    
    # To have colors for ls and all grep commands such as grep, egrep and zgrep
    export CLICOLOR=1
    export LS_COLORS='no=00:fi=00:di=00;34:ln=01;36:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.jpg=01;35:*.jpeg=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:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.avi=01;35:*.fli=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.ogg=01;35:*.mp3=01;35:*.wav=01;35:*.xml=00;31:'
    #export GREP_OPTIONS='--color=auto' #deprecated
    
    #alias grep="/usr/bin/grep $GREP_OPTIONS"
    #unset GREP_OPTIONS
    
    65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452
    
    # 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'
    
    #######################################################
    # GENERAL ALIAS'S
    #######################################################
    
    # Alias's to modified commands
    alias cp='cp -i'
    alias mv='mv -i'
    alias rm='rm -iv'
    alias mkdir='mkdir -p'
    alias ps='ps auxf'
    alias ping='ping -c 10'
    alias less='less -R'
    alias cls='clear'
    alias apt-get='apt-get'
    alias multitail='multitail --no-repeat -c'
    alias freshclam='freshclam'
    alias vi='vim'
    alias vis='vim "+set si"'
    
    # Change directory aliases
    alias home='cd ~'
    alias cd..='cd ..'
    alias ..='cd ..'
    alias ...='cd ../..'
    alias ....='cd ../../..'
    alias .....='cd ../../../..'
    
    # cd into the old directory
    alias bd='cd "$OLDPWD"'
    
    # Remove a directory and all files
    alias rmd='/bin/rm  --recursive --force --verbose '
    
    # Alias's for multiple directory listing commands
    alias la='ls -Alh' # show hidden files
    alias ls='ls -aFh --color=always' # add colors and file type extensions
    alias lx='ls -lXBh' # sort by extension
    alias lk='ls -lSrh' # sort by size
    alias lc='ls -lcrh' # sort by change time
    alias lu='ls -lurh' # sort by access time
    alias lr='ls -lRh' # recursive ls
    alias lt='ls -ltrh' # sort by date
    alias lm='ls -alh |more' # pipe through 'more'
    alias lw='ls -xAh' # wide listing format
    alias ll='ls -Fls' # long listing format
    alias labc='ls -lap' #alphabetical sort
    alias lf="ls -l | egrep -v '^d'" # files only
    alias ldir="ls -l | egrep '^d'" # directories only
    
    # alias chmod commands
    alias mx='chmod a+x'
    alias 000='chmod -R 000'
    alias 644='chmod -R 644'
    alias 666='chmod -R 666'
    alias 755='chmod -R 755'
    alias 777='chmod -R 777'
    
    # Search command line history
    alias h="history | grep "
    
    # Search running processes
    alias p="ps aux | grep "
    alias topcpu="/bin/ps -eo pcpu,pid,user,args | sort -k 1 -r | head -10"
    
    # Search files in the current folder
    alias f="find . | grep "
    
    # Count all files (recursively) in the current folder
    alias countfiles="for t in files links directories; do echo \`find . -type \${t:0:1} | wc -l\` \$t; done 2> /dev/null"
    
    # To see if a command is aliased, a file, or a built-in command
    alias checkcommand="type -t"
    
    # Show all logs in /var/log
    alias logs="sudo find /var/log -type f -exec file {} \; | grep 'text' | cut -d' ' -f1 | sed -e's/:$//g' | grep -v '[0-9]$' | xargs tail -f"
    
    # SHA1
    alias sha1='openssl sha1'
    
    #######################################################
    # SPECIAL FUNCTIONS
    #######################################################
    
    # Extracts any archive(s) (if unp isn't installed)
    extract () {
    	for archive in $*; do
    		if [ -f $archive ] ; then
    			case $archive in
    				*.tar.bz2)   tar xvjf $archive    ;;
    				*.tar.gz)    tar xvzf $archive    ;;
    				*.bz2)       bunzip2 $archive     ;;
    				*.rar)       rar x $archive       ;;
    				*.gz)        gunzip $archive      ;;
    				*.tar)       tar xvf $archive     ;;
    				*.tbz2)      tar xvjf $archive    ;;
    				*.tgz)       tar xvzf $archive    ;;
    				*.zip)       unzip $archive       ;;
    				*.Z)         uncompress $archive  ;;
    				*.7z)        7z x $archive        ;;
    				*)           echo "don't know how to extract '$archive'..." ;;
    			esac
    		else
    			echo "'$archive' is not a valid file!"
    		fi
    	done
    }
    
    # Searches for text in all files in the current folder
    ftext ()
    {
    	# -i case-insensitive
    	# -I ignore binary files
    	# -H causes filename to be printed
    	# -r recursive search
    	# -n causes line number to be printed
    	# optional: -F treat search term as a literal, not a regular expression
    	# optional: -l only print filenames and not the matching lines ex. grep -irl "$1" *
    	grep -iIHrn --color=always "$1" . | less -r
    }
    
    # Copy file with a progress bar
    cpp()
    {
    	set -e
    	strace -q -ewrite cp -- "${1}" "${2}" 2>&1 \
    	| awk '{
    	count += $NF
    	if (count % 10 == 0) {
    		percent = count / total_size * 100
    		printf "%3d%% [", percent
    		for (i=0;i<=percent;i++)
    			printf "="
    			printf ">"
    			for (i=percent;i<100;i++)
    				printf " "
    				printf "]\r"
    			}
    		}
    	END { print "" }' total_size=$(stat -c '%s' "${1}") count=0
    }
    
    # Copy and go to the directory
    cpg ()
    {
    	if [ -d "$2" ];then
    		cp $1 $2 && cd $2
    	else
    		cp $1 $2
    	fi
    }
    
    # Move and go to the directory
    mvg ()
    {
    	if [ -d "$2" ];then
    		mv $1 $2 && cd $2
    	else
    		mv $1 $2
    	fi
    }
    
    # Create and go to the directory
    mkdirg ()
    {
    	mkdir -p $1
    	cd $1
    }
    
    # Goes up a specified number of directories  (i.e. up 4)
    up ()
    {
    	local d=""
    	limit=$1
    	for ((i=1 ; i <= limit ; i++))
    		do
    			d=$d/..
    		done
    	d=$(echo $d | sed 's/^\///')
    	if [ -z "$d" ]; then
    		d=..
    	fi
    	cd $d
    }
    
    #Automatically do an ls after each cd
    # cd ()
    # {
    # 	if [ -n "$1" ]; then
    # 		builtin cd "$@" && ls
    # 	else
    # 		builtin cd ~ && ls
    # 	fi
    # }
    
    # Returns the last 2 fields of the working directory
    pwdtail ()
    {
    	pwd|awk -F/ '{nlast = NF -1;print $nlast"/"$NF}'
    }
    
    # Show the current version of the operating system
    ver ()
    {
    	local dtype
    	dtype=$(distribution)
    
    	if [ $dtype == "redhat" ]; then
    		if [ -s /etc/redhat-release ]; then
    			cat /etc/redhat-release && uname -a
    		else
    			cat /etc/issue && uname -a
    		fi
    	elif [ $dtype == "suse" ]; then
    		cat /etc/SuSE-release
    	elif [ $dtype == "debian" ]; then
    		lsb_release -a
    		# sudo cat /etc/issue && sudo cat /etc/issue.net && sudo cat /etc/lsb_release && sudo cat /etc/os-release # Linux Mint option 2
    	elif [ $dtype == "gentoo" ]; then
    		cat /etc/gentoo-release
    	elif [ $dtype == "mandriva" ]; then
    		cat /etc/mandriva-release
    	elif [ $dtype == "slackware" ]; then
    		cat /etc/slackware-version
    	else
    		if [ -s /etc/issue ]; then
    			cat /etc/issue
    		else
    			echo "Error: Unknown distribution"
    			exit 1
    		fi
    	fi
    }
    
    # For some reason, rot13 pops up everywhere
    rot13 () {
    	if [ $# -eq 0 ]; then
    		tr '[a-m][n-z][A-M][N-Z]' '[n-z][a-m][N-Z][A-M]'
    	else
    		echo $* | tr '[a-m][n-z][A-M][N-Z]' '[n-z][a-m][N-Z][A-M]'
    	fi
    }
    
    # Trim leading and trailing spaces (for scripts)
    trim()
    {
    	local var=$@
    	var="${var#"${var%%[![:space:]]*}"}"  # remove leading whitespace characters
    	var="${var%"${var##*[![:space:]]}"}"  # remove trailing whitespace characters
    	echo -n "$var"
    }
    
    #######################################################
    # Set the ultimate amazing command prompt
    #######################################################
    
    alias cpu="grep 'cpu ' /proc/stat | awk '{usage=(\$2+\$4)*100/(\$2+\$4+\$5)} END {print usage}' | awk '{printf(\"%.1f\n\", \$1)}'"
    function __setprompt
    {
    	local LAST_COMMAND=$? # Must come first!
    
    	# Define colors
    	local LIGHTGRAY="\033[0;37m"
    	local WHITE="\033[1;37m"
    	local BLACK="\033[0;30m"
    	local DARKGRAY="\033[1;30m"
    	local RED="\033[0;31m"
    	local LIGHTRED="\033[1;31m"
    	local GREEN="\033[0;32m"
    	local LIGHTGREEN="\033[1;32m"
    	local BROWN="\033[0;33m"
    	local YELLOW="\033[1;33m"
    	local BLUE="\033[0;34m"
    	local LIGHTBLUE="\033[1;34m"
    	local MAGENTA="\033[0;35m"
    	local LIGHTMAGENTA="\033[1;35m"
    	local CYAN="\033[0;36m"
    	local LIGHTCYAN="\033[1;36m"
    	local NOCOLOR="\033[0m"
    
    	# Show error exit code if there is one
    	if [[ $LAST_COMMAND != 0 ]]; then
    		# PS1="\[${RED}\](\[${LIGHTRED}\]ERROR\[${RED}\])-(\[${LIGHTRED}\]Exit Code \[${WHITE}\]${LAST_COMMAND}\[${RED}\])-(\[${LIGHTRED}\]"
    		PS1="\[${DARKGRAY}\](\[${LIGHTRED}\]ERROR\[${DARKGRAY}\])-(\[${RED}\]Exit Code \[${LIGHTRED}\]${LAST_COMMAND}\[${DARKGRAY}\])-(\[${RED}\]"
    		if [[ $LAST_COMMAND == 1 ]]; then
    			PS1+="General error"
    		elif [ $LAST_COMMAND == 2 ]; then
    			PS1+="Missing keyword, command, or permission problem"
    		elif [ $LAST_COMMAND == 126 ]; then
    			PS1+="Permission problem or command is not an executable"
    		elif [ $LAST_COMMAND == 127 ]; then
    			PS1+="Command not found"
    		elif [ $LAST_COMMAND == 128 ]; then
    			PS1+="Invalid argument to exit"
    		elif [ $LAST_COMMAND == 129 ]; then
    			PS1+="Fatal error signal 1"
    		elif [ $LAST_COMMAND == 130 ]; then
    			PS1+="Script terminated by Control-C"
    		elif [ $LAST_COMMAND == 131 ]; then
    			PS1+="Fatal error signal 3"
    		elif [ $LAST_COMMAND == 132 ]; then
    			PS1+="Fatal error signal 4"
    		elif [ $LAST_COMMAND == 133 ]; then
    			PS1+="Fatal error signal 5"
    		elif [ $LAST_COMMAND == 134 ]; then
    			PS1+="Fatal error signal 6"
    		elif [ $LAST_COMMAND == 135 ]; then
    			PS1+="Fatal error signal 7"
    		elif [ $LAST_COMMAND == 136 ]; then
    			PS1+="Fatal error signal 8"
    		elif [ $LAST_COMMAND == 137 ]; then
    			PS1+="Fatal error signal 9"
    		elif [ $LAST_COMMAND -gt 255 ]; then
    			PS1+="Exit status out of range"
    		else
    			PS1+="Unknown error code"
    		fi
    		PS1+="\[${DARKGRAY}\])\[${NOCOLOR}\]\n"
    	else
    		PS1=""
    	fi
    
    	# Date
    	PS1+="\[${DARKGRAY}\](\[${CYAN}\]\$(date +%a) $(date +%b-'%-m')" # Date
    	PS1+="${BLUE} $(date +'%-I':%M:%S%P)\[${DARKGRAY}\])-" # Time
    
    	# CPU
    	PS1+="(\[${MAGENTA}\]CPU $(cpu)%"
    
    	# Jobs
    	PS1+="\[${DARKGRAY}\]:\[${MAGENTA}\]\j"
    
    	# Network Connections (for a server - comment out for non-server)
    	PS1+="\[${DARKGRAY}\]:\[${MAGENTA}\]Net $(awk 'END {print NR}' /proc/net/tcp)"
    
    	PS1+="\[${DARKGRAY}\])-"
    
    	# User and server
    	local SSH_IP=`echo $SSH_CLIENT | awk '{ print $1 }'`
    	local SSH2_IP=`echo $SSH2_CLIENT | awk '{ print $1 }'`
    	if [ $SSH2_IP ] || [ $SSH_IP ] ; then
    		PS1+="(\[${RED}\]\u@\h"
    	else
    		PS1+="(\[${RED}\]\u"
    	fi
    
    	# Current directory
    	PS1+="\[${DARKGRAY}\]:\[${BROWN}\]\w\[${DARKGRAY}\])-"
    
    	# Total size of files in current directory
    	PS1+="(\[${GREEN}\]$(/bin/ls -lah | /bin/grep -m 1 total | /bin/sed 's/total //')\[${DARKGRAY}\]:"
    
    	# Number of files
    	PS1+="\[${GREEN}\]\$(/bin/ls -A -1 | /usr/bin/wc -l)\[${DARKGRAY}\])"
    
    	# Skip to the next line
    	PS1+="\n"
    
      # singularity?
      if [ -e /environment ] ; then
          PS1+="singularity"
      fi
    
    	if [[ $EUID -ne 0 ]]; then
    		PS1+="\[${GREEN}\]>\[${NOCOLOR}\] " # Normal user
    	else
    		PS1+="\[${RED}\]>\[${NOCOLOR}\] " # Root user
    	fi
    
    	# PS2 is used to continue a command using the \ character
    	PS2="\[${DARKGRAY}\]>\[${NOCOLOR}\] "
    
    	# PS3 is used to enter a number choice in a script
    	PS3='Please enter a number from above list: '
    
    	# PS4 is used for tracing a script in debug mode
    	PS4='\[${DARKGRAY}\]+\[${NOCOLOR}\] '
    }
    PROMPT_COMMAND='__setprompt'