/My bashrc(Thank you linuxquestions.org, ubuntuforums.org, stackexchange, and others I'm forgetting)
Last active
February 3, 2023 01:54
-
-
Save KoenDG/e4186be5e7d866c17ffe42ac38eb8b93 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# ~/.bashrc: executed by bash(1) for non-login shells. | |
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc) | |
# for examples | |
iatest=$(expr index "$-" i) | |
# Disable the bell | |
if [[ $iatest > 0 ]]; then bind "set bell-style visible"; fi | |
# 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 | |
# If not running interactively, don't do anything | |
case $- in | |
*i*) ;; | |
*) return;; | |
esac | |
# don't put duplicate lines or lines starting with space in the history. | |
# See bash(1) for more options | |
HISTCONTROL=erasedups:ignoredups:ignorespace | |
# append to the history file, don't overwrite it | |
shopt -s histappend | |
# Check the window size after each command and, if necessary, update the values of LINES and COLUMNS | |
shopt -s checkwinsize | |
# If set, and Readline is being used, the results of history substitution are not immediately passed to the shell parser. Instead, the resulting line is loaded into the Readline editing buffer, allowing further modification. | |
shopt -s histverify | |
# for setting history length see HISTSIZE and HISTFILESIZE in bash(1) | |
HISTSIZE=1000 | |
HISTFILESIZE=10000 | |
# If set, the pattern "**" used in a pathname expansion context will | |
# match all files and zero or more directories and subdirectories. | |
#shopt -s globstar | |
# make less more friendly for non-text input files, see lesspipe(1) | |
[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)" | |
# set variable identifying the chroot you work in (used in the prompt below) | |
if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then | |
debian_chroot=$(cat /etc/debian_chroot) | |
fi | |
# set a fancy prompt (non-color, unless we know we "want" color) | |
case "$TERM" in | |
xterm-color|*-256color) color_prompt=yes;; | |
esac | |
# uncomment for a colored prompt, if the terminal has the capability; turned | |
# off by default to not distract the user: the focus in a terminal window | |
# should be on the output of commands, not on the prompt | |
#force_color_prompt=yes | |
if [ -n "$force_color_prompt" ]; then | |
if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then | |
# We have color support; assume it's compliant with Ecma-48 | |
# (ISO/IEC-6429). (Lack of such support is extremely rare, and such | |
# a case would tend to support setf rather than setaf.) | |
color_prompt=yes | |
else | |
color_prompt= | |
fi | |
fi | |
if [ "$color_prompt" = yes ]; then | |
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ ' | |
else | |
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ ' | |
fi | |
unset color_prompt force_color_prompt | |
# If this is an xterm set the title to user@host:dir | |
case "$TERM" in | |
xterm*|rxvt*) | |
PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1" | |
;; | |
*) | |
;; | |
esac | |
# enable color support of ls and also add handy aliases | |
if [ -x /usr/bin/dircolors ]; then | |
test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)" | |
alias ls='ls --color=auto' | |
#alias dir='dir --color=auto' | |
#alias vdir='vdir --color=auto' | |
alias grep='grep --color=auto' | |
alias fgrep='fgrep --color=auto' | |
alias egrep='egrep --color=auto' | |
fi | |
# colored GCC warnings and errors | |
#export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01' | |
# some more ls aliases | |
alias ll='ls -lahF' | |
alias la='ls -A' | |
alias l='ls -CF' | |
# Add an "alert" alias for long running commands. Use like so: | |
# sleep 10; alert | |
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"' | |
# Alias definitions. | |
# You may want to put all your additions into a separate file like | |
# ~/.bash_aliases, instead of adding them here directly. | |
# See /usr/share/doc/bash-doc/examples in the bash-doc package. | |
if [ -f ~/.bash_aliases ]; then | |
. ~/.bash_aliases | |
fi | |
# enable programmable completion features (you don't need to enable | |
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile | |
# sources /etc/bash.bashrc). | |
if ! shopt -oq posix; then | |
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 | |
fi | |
# To have colors for ls and all grep commands such as grep, egrep and zgrep | |
# Guide for LS_COLORS: https://web.archive.org/web/20180106090557/http://linux-sxs.org/housekeeping/lscolors.html | |
export CLICOLOR=1 | |
export LS_COLORS='no=00:fi=00:di=4;100;93: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:' | |
alias grep="/bin/grep --color=auto" | |
alias edit="nano -u -c -W --tabsize=4 --smooth" | |
alias nano="nano -u -c -W --tabsize=4 --smooth" | |
# 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' | |
export JAVA_HOME=/usr/lib/jvm/java-8-oracle | |
export PATH=$JAVA_HOME/bin:$PATH | |
# Extracts any archive(s) (if unp isn't installed) | |
extract () { | |
if [ -f $1 ] ; then | |
case $1 in | |
*.tar.bz2) tar xvjf $1 ;; | |
*.tar.xz) tar xvJf $1 ;; | |
*.tar.gz) tar xvzf $1 ;; | |
*.bz2) bunzip2 $1 ;; | |
*.rar) unrar x $1 ;; | |
*.gz) gunzip $1 ;; | |
*.tar) tar xvf $1 ;; | |
*.tbz2) tar xvjf $1 ;; | |
*.tgz) tar xvzf $1 ;; | |
*.zip) unzip $1 ;; | |
*.Z) uncompress $1 ;; | |
*.7z) 7z x $1 ;; | |
*.ace) unace x $1 ;; | |
*) echo "don't know how to extract '$1'..." ;; | |
esac | |
else | |
echo "'$1' is not a valid file!" | |
fi | |
} | |
# Search running processes | |
alias topcpu="/bin/ps -eo pcpu,pid,user,args | sort -k 1 -r | head -10" | |
# Show current network connections to the server | |
alias ipview="netstat -anpl | grep :80 | awk {'print \$5'} | cut -d\":\" -f1 | sort | uniq -c | sort -n | sed -e 's/^ *//' -e 's/ *\$//'" | |
# Show open ports | |
alias openports='netstat -nape --inet' | |
# 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 | |
} | |
# 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 | |
} | |
# Show current network information | |
netinfo () | |
{ | |
echo "--------------- Network Information ---------------" | |
/sbin/ifconfig | awk /'inet addr/ {print $2}' | |
echo "" | |
/sbin/ifconfig | awk /'Bcast/ {print $3}' | |
echo "" | |
/sbin/ifconfig | awk /'inet addr/ {print $4}' | |
/sbin/ifconfig | awk /'HWaddr/ {print $4,$5}' | |
echo "---------------------------------------------------" | |
} | |
# IP address lookup | |
alias whatismyip="whatsmyip" | |
function whatsmyip () | |
{ | |
# Dumps a list of all IP addresses for every device | |
# /sbin/ifconfig |grep -B1 "inet addr" |awk '{ if ( $1 == "inet" ) { print $2 } else if ( $2 == "Link" ) { printf "%s:" ,$1 } }' |awk -F: '{ print $1 ": " $3 }'; | |
# Internal IP Lookup | |
echo -n "Internal IP: " ; /sbin/ifconfig eth0 | grep "inet addr" | awk -F: '{print $2}' | awk '{print $1}' | |
# External IP Lookup | |
echo -n "External IP: " ; wget http://smart-ip.net/myip -O - -q | |
} | |
# 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 | |
} | |
function jobs_count { | |
cnt=$(jobs -l | wc -l) | |
if [ $cnt -eq 0 ] ;then | |
echo -ne ${cnt} | |
fi | |
if [ $cnt -gt 0 ]; then | |
echo -ne "\e[93m${cnt}\e[m" | |
fi | |
} | |
# grep history | |
hgrep () { | |
history | egrep --color=auto "$@" | egrep --color=auto -v "hgrep $@" | |
} | |
#Task List | |
TASKFILE="$HOME/.bashtask" #Hidden for neatness | |
NC='\033[0m' # No Color | |
LIGHTRED='\e[1;31m' | |
LIGHTBLUE='\e[1;34m' | |
if [ -f "$TASKFILE" ] && [ $(stat -c %s "$TASKFILE") != 0 ] #Check if file has content | |
then | |
echo -e "${LIGHTRED}Task List${NC} as of ${LIGHTBLUE}$(date -r "$TASKFILE")${NC}" | |
echo "" | |
cat "$TASKFILE" | |
printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' "-" | |
else | |
echo "Yay! No tasks :)" | |
printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' "-" | |
touch "$TASKFILE" | |
fi | |
alias tasklist="bash" | |
function taskadd() { echo "- $1" >> "$TASKFILE"; } #Example: taskadd "Go grocery shopping" | |
function taskin() { sed -i "$1i- $2" "$TASKFILE"; } #Insert a task between items | |
function taskrm() { sed -i "$1d" "$TASKFILE"; } #Example: taskrm 2 --> Removes second item in list | |
function taskcl() { rm "$TASKFILE"; touch "$TASKFILE"; } #Delete and create a new taskfile | |
#Converting audio and video files | |
function 2ogg() { eyeD3 --remove-all-images "$1"; fname="${1%.*}"; sox "$1" "$fname.ogg"; } | |
function 2wav() { fname="${1%.*}"; ffmpeg -threads 0 -i "$1" "$fname.wav"; } | |
function 2aif() { fname="${1%.*}"; ffmpeg -threads 0 -i "$1" "$fname.aif"; } | |
function 2mp3() { fname="${1%.*}"; ffmpeg -threads 0 -i "$1" "$fname.mp3"; } | |
function 2mov() { fname="${1%.*}"; ffmpeg -threads 0 -i "$1" "$fname.mov"; } | |
function 2mp4() { fname="${1%.*}"; ffmpeg -threads 0 -i "$1" "$fname.mp4"; } | |
function 2avi() { fname="${1%.*}"; ffmpeg -threads 0 -i "$1" "$fname.avi"; } | |
function 2webm() { fname="${1%.*}"; ffmpeg -threads 0 -i "$1" -c:v libvpx "$fname.webm"; } | |
function 2h265() { fname="${1%.*}"; ffmpeg -threads 0 -i "$1" -c:v libx265 "$fname'_converted'.mp4"; } | |
function 2flv() { fname="${1%.*}"; ffmpeg -threads 0 -i "$1" "$fname.flv"; } | |
function 2mpg() { fname="${1%.*}"; ffmpeg -threads 0 -i "$1" "$fname.mpg"; } | |
#Converting documents and images | |
function 2txt() { soffice --headless txt "$1"; } | |
function 2pdf() { | |
if [ ${1: -4} == ".html" ] | |
then | |
fname="${1%.*}" | |
soffice --headless --convert-to odt "$1" | |
soffice --headless pdf "$fname.html" | |
else | |
soffice --headless pdf "$1" | |
fi | |
} | |
function 2doc() { soffice --headless doc "$1"; } | |
function 2odt() { soffice --headless odt "$1"; } | |
function 2jpeg() { fname="${1%.*}"; convert "$1" "$fname.jpg"; } | |
function 2jpg() { fname="${1%.*}"; convert "$1" "$fname.jpg"; } | |
function 2png() { fname="${1%.*}"; convert "$1" "$fname.png"; } | |
function 2bmp() { fname="${1%.*}"; convert "$1" "$fname.bmp"; } | |
function 2tiff() { fname="${1%.*}"; convert "$1" "$fname.tiff"; } | |
function 2gif() { | |
fname="${1%.*}" | |
if [ ! -d "/tmp/gif" ]; then mkdir "/tmp/gif"; fi | |
if [ ${1: -4} == ".mp4" ] || [ ${1: -4} == ".mov" ] || [ ${1: -4} == ".avi" ] || [ ${1: -4} == ".flv" ] || [ ${1: -4} == ".mpg" ] || [ ${1: -4} == ".webm" ] | |
then | |
ffmpeg -i "$1" -r 10 -vf 'scale=trunc(oh*a/2)*2:480' /tmp/gif/out%04d.png | |
convert -delay 1x10 "/tmp/gif/*.png" -fuzz 2% +dither -coalesce -layers OptimizeTransparency +map "$fname.gif" | |
else | |
convert "$1" "$fname.gif" | |
fi | |
rm -r "/tmp/gif" | |
} | |
diskcopy(){ dd if=$1 of=$2; } | |
alias tracert="traceroute" | |
#Generate a random strong password | |
alias genpasswd="strings /dev/urandom | grep -o '[[:alnum:]]' | head -n 30 | tr -d '\n'; echo" | |
#Expand current directory structure in tree form | |
alias treed="ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\//--/g' -e 's/^/ /' -e 's/-/|/'" | |
#List by file size in current directory | |
sbs() { du -b --max-depth 1 | sort -nr | perl -pe 's{([0-9]+)}{sprintf "%.1f%s", $1>=2**30? ($1/2**30, "G"): $1>=2**20? ($1/2**20, "M"): $1>=2**10? ($1/2**10, "K"): ($1, "")}e';} | |
#Show active ports | |
alias port='netstat -tulpan' | |
#Use this for when the boss comes around to look busy. | |
alias busy="cat /dev/urandom | hexdump -C | grep 'ca fe'" | |
####################################################### | |
# 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) $(date +%d)" #Date | |
PS1+="${BLUE} $(date +'%-I':%M:%S%P)\[${DARKGRAY}\])-" # Time | |
# CPU | |
PS1+="(\[${MAGENTA}\]CPU $(cpu)%" | |
# Jobs | |
PS1+="\[${DARKGRAY}\]:\[${MAGENTA}\]$(jobs_count)" | |
# 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}\]\[${RED}\]$(__git_ps1)\[${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" | |
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' |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment