Eine derjenigen Dateien, die man auf jeden Fall an seine persönlichen Bedürfnisse anpassen sollte, ist die .bashrc. Diese Datei ermöglicht es unter anderem, den Prompt der Bash-Shell zu setzen und eigene Funktionen sowie Aliasnamen für häufig benutzte Befehle festzulegen. Meine bashrc sieht aktuell so aus und enthält Code-Schnipsel von John Lawrence, geekosphere.org und Isaac Schlueter:
# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples
# If not running interactively, don't do anything
[ -z "$PS1" ] && return
# don't put duplicate lines in the history. See bash(1) for more options
export HISTCONTROL=ignoredups
# ... and ignore same sucessive entries.
export HISTCONTROL=ignoreboth
# check the window size after each command and, if necessary,
# update the values of LINES and COLUMNS.
shopt -s checkwinsize
# 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
function jobcount {
jobs | wc -l | tr -d " "
}
# Color prompt
bash_color_prompt() {
local BLACK="\[\e[0;30m\]"
local BLUE="\[\e[0;34m\]"
local GREEN="\[\e[0;32m\]"
local CYAN="\[\e[0;36m\]"
local RED="\[\e[0;31m\]"
local PURPLE="\[\e[0;35m\]"
local BROWN="\[\e[0;33m\]"
local LIGHTGRAY="\[\e[0;37m\]"
local DARKGRAY="\[\e[1;30m\]"
local LIGHTBLUE="\[\e[1;34m\]"
local LIGHTGREEN="\[\e[1;32m\]"
local LIGHTCYAN="\[\e[1;36m\]"
local LIGHTRED="\[\e[1;31m\]"
local LIGHTPURPLE="\[\e[1;35m\]"
local YELLOW="\[\e[1;33m\]"
local WHITE="\[\e[1;37m\]"
# No Color
local NC="\[\e[0m\]"
local cur_tty=$(tty | sed -e "s/.*tty\(.*\)/\1/")
local loadavg='$(uptime | sed -e "s/.*load average: \(.*\...\), \(.*\...\), \(.*\...\)/\1/" -e "s/ //g")'
PS1="${LIGHTRED}\u${NC}@${LIGHTBLUE}\h${NC}-${GREEN}$(date +"%d.%m.%Y %H:%M:%S")${NC}:${YELLOW}\w\n${BROWN}[j:`jobcount`, t:$cur_tty, l:$loadavg]${WHITE}\n\\$ ${NC}"
}
# set a fancy prompt (non-color, unless we know we "want" color)
case "$TERM" in
xterm-color) 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\]\$ '
bash_color_prompt
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*)
PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD/$HOME/~}\007"'
;;
*)
;;
esac
# 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 [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi
#Sicherstellen, dass Sprache deutsch und Zeitzone für Deutschland passt
export LC_CTYPE=de_DE.UTF-8
export LC_ALL=""
export LANG=$LC_CTYPE
export LANGUAGE=$LANG
export TZ=Europe/Berlin
################## Start functions from http://www.perlmonks.org/?viewmode=public;node_id=359168 ###################################
# path-manipulating shell functions
function lspath {
echo $PATH | tr ':' '\n'
}
function makepath {
unset NEW_PATH
while read PATHEL; do
NEW_PATH="$NEW_PATH:$PATHEL"
done
echo ${NEW_PATH#:}
}
function uniqpath {
PATH=`lspath | awk '{seen[$0]++; if (seen[$0]==1){print}}' | makepath`
}
function cleanpath {
uniqpath
PATH=`lspath | sed -e 's|\/$||' -ne '/./p' | makepath`
}
function addpath {
PATH=$1:$PATH
cleanpath
}
function appendpath {
PATH=$PATH:$1
cleanpath
}
function delpath {
PATH=`lspath | grep -v "^$1\$" | makepath`
}
function editpath {
TEMP=`mktemp "/tmp/${FUNCNAME}.XXXXXX"`
lspath > $TEMP
${EDITOR:-vi} $TEMP
PATH=`makepath < $TEMP`
rm -f $TEMP
}
################## End functions from http://www.perlmonks.org/?viewmode=public;node_id=359168 ###################################
################## Begin functions from http://www.johnlawrence.net/code/?f=sfbashrc ###################################
#compare files using comm (requires perl) - http://www.shell-fu.org/lister.php?id=186
compare(){
comm $1 $2 | perl -pe 's/^/1: /g;s/1: \t/2: /g;s/2: \t/A: /g;' | sort
}
# overwrite a file with zeroes - http://www.shell-fu.org/lister.php?id=94
zero() {
case "$1" in
"") echo "Usage: zero "
return -1;
esac
filesize=`wc -c "$1" | awk '{print $1}'`
dd if=/dev/zero of=$1 count=$filesize bs=1
}
# create a terminal calculator - http://www.shell-fu.org/lister.php?id=216
calc(){ echo "${1}"|bc -l; }
# copy and paste from the command line - http://www.shell-fu.org/lister.php?id=177
ccopy(){ cp $1 /tmp/ccopy.$1; }
alias cpaste="ls /tmp/ccopy* | sed 's|[^\.]*.\.||' | xargs -I % mv /tmp/ccopy.% ./%"
# bash function to decompress archives - http://www.shell-fu.org/lister.php?id=375
extract () {
if [ -f $1 ] ; then
case $1 in
*.tar.bz2) 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 ;;
*) echo "'$1' cannot be extracted via >extract<" ;;
esac
else
echo "'$1' is not a valid file"
fi
}
################## End functions from http://www.johnlawrence.net/code/?f=sfbashrc ###################################
################## Begin functions from http://foohack.com/tests/bash_extras/.extra.bashrc ###################################
# chooses the first argument that matches a file in the path.
choose_first () {
for i in "$@"; do
if ! [ -f "$i" ] && inpath "$i"; then
i="`which $i`"
fi
if [ -f "$i" ]; then
echo $i
break
fi
done
}
inpath () {
! [ $# -eq 1 ] && echo "usage: inpath <file>" && return 1
f="`which $1 2>/dev/null`"
[ -f "$f" ] && return 0
return 1
}
# headless <command> [<key>]
# to reconnect, do: headless "" <key>
headless () {
if [ "$2" == "" ]; then
hash=`md5 -qs "$1"`
else
hash="$2"
fi
if [ "$1" != "" ]; then
dtach -n /tmp/headless-$hash bash -l -c "$1"
else
dtach -A /tmp/headless-$hash bash -l
fi
}
# function to do something in the background
back () {
( $@ ) &
}
# do something very quietly.
quiet () {
( $@ ) >/dev/null 2>/dev/null
}
# useful commands:
_set_editor () {
edit_cmd="`choose_first $@`"
if [ -f "$edit_cmd" ]; then
if [ -f "${edit_cmd}_wait" ]; then
export EDITOR="${edit_cmd}_wait"
else
export EDITOR="$edit_cmd"
fi
fi
alias edit="$edit_cmd"
alias sued="sudo $edit_cmd"
}
# my list of editors, by preference.
_set_editor mate vim vi pico ed
# shebang <file> <program> [<args>]
shebang () {
sb="shebang"
if [ $# -lt 2 ]; then
echo "usage: $sb <file> <program> [<arg string>]"
return 1
elif ! [ -f "$1" ]; then
echo "$sb: $1 is not a file."
return 1
fi
if ! [ -w "$1" ]; then
echo "$sb: $1 is not writable."
return 1
fi
prog="$2"
! [ -f "$prog" ] && prog="`which $prog 2>/dev/null`"
if ! [ -x "$prog" ]; then
echo "$sb: $2 is not executable, or not in path."
return 1
fi
chmod ogu+x "$1"
prog="#!$prog"
[ "$3" != "" ] && prog="$prog $3"
if ! [ "`head -n 1 \"$1\"`" == "$prog" ]; then
contents="`cat \"$1\"`"
newcontents=`cat <<ENDSHEBANG
$prog
$contents
ENDSHEBANG`
echo -n "$newcontents" > $1
fi
return 0
}
rand () {
# r=``
# echo $r
echo `php -r 'echo rand();'`
}
pickrand () {
cnt=0
if [ $# == 1 ]; then
tst=$1
else
tst="-d"
fi
for i in *; do
[ $tst "$i" ] && let 'cnt += 1'
done
r=`rand`
p=0
[ $cnt -eq 0 ] && return 1
let 'p = r % cnt'
# echo "[$cnt $r --- $p]"
cnt=0
for i in *; do
# echo "[$cnt]"
[ $tst "$i" ] && let 'cnt += 1' && [ $cnt -eq $p ] && echo "$i" && return
done
}
# a friendlier delete on the command line
! [ -d ~/.Trash ] && mkdir ~/.Trash
chmod 700 ~/.Trash
alias emptytrash="find ~/.Trash -not -path ~/.Trash -exec rm -rf {} \; 2>/dev/null"
if ! inpath del; then
if [ -d ~/.Trash ]; then
del () {
for i in "$@"; do
mv "$i" ~/.Trash/
done
}
else
alias del=rm
fi
fi
# find files in current dir by name (not in package dirs)
f () {
find . -name "$1" -not -path "*/rhel.*.*.package/*" -not -path "*/CVS/*" -not -path "*/CVS" -not -path "*/rhel.*.*.package"
}
getip () {
for each in $@; do
echo $each
echo "nslookup:"
nslookup $each | grep Address: | grep -v '#' | egrep -o '([0-9]+\.){3}[0-9]+'
echo "ping:"
ping -c1 -t1 $each | egrep -o '([0-9]+\.){3}[0-9]+' | head -n1
done
}
ips () {
ip addr show | awk -F":" '($1>0){split($2,a," ");print a[1] "- "}($1 ~ /([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/){split($1,a," "); print a[2]}' | tr '\n' '\t' | sed 's/\/[0-9]\+//g' | sed 's/\(\w\+\)-/\n\1/g' | sed '/^$/d' && echo
}
macs () {
ip addr show | awk -F":" '($1>0){split($2,a," ");print a[1] "- "}($1 ~ /link/){split($0,a," "); print a[2]}' | tr '\n' '\t' | sed 's/\/[0-9]\+//g' | sed 's/\(\w\+\)-/\n\1/g' | sed '/^$/d' && echo
}
pg () {
ps aux | grep $@ | grep -v grep
}
pid () {
pg $@ | awk '{print $2}'
}
repeat () {
if [ "$2" == "" ]; then
delay=1
else
delay=$2
fi
while sleep $delay; do
clear
date +%s
$1
done
}
watch () {
if [ "$2" == "" ]; then
delay=1
else
delay="$2"
fi
i="";
j="";
while sleep $delay; do
i=`$1`;
if [ "$i" != "$j" ]; then
date +%s
echo $i
fi
done
}
# more persistent wget for fetching files to a specific filename.
fetch_to () {
[ $# -ne 2 ] && echo "usage: fetch_to <url> <filename>" && return 1
urltofetch=$1
fname="$2"
wget -O "$fname" $urltofetch
}
################## End functions from http://foohack.com/tests/bash_extras/.extra.bashrc ###################################
Durch Aufruf von
source ~/.bashrc
kann man ohne Neustart der Shell die Konfigurationsdatei laden. Die in der .bashrc referenzierte .bash_aliases sieht folgendermaßen aus:
# Alias definitions
# some more ls aliases
alias ll='ls -lF'
alias la='ls -aF'
alias lla='ls -laF'
alias l='ls -CF'
alias ld='ls -al -d * | egrep "^d"' # only subdirectories
alias lt='ls -alt | head -20' # recently changed files
alias ag="alias | $grep"
# convenience redefinitions
alias cd..='cd ..'
alias cd-='cd -'
alias dselect='dselect --expert'
alias fg-='fg -'
alias more="less -e"
alias lsdevs="sudo lsof | $grep /dev"
alias md='mkdir -p'
alias rd=rmdir
alias ..='cd ..'
alias ...='cd ../..'
#also remember popd
alias +='pushd .'
alias mvsafe="mv -i"
# enable color support of ls and also add handy aliases
if [ "$TERM" != "dumb" ] && [ -x /usr/bin/dircolors ]; then
eval "`dircolors -b`"
alias ls='ls --color=auto'
alias dir='ls --color=auto --format=vertical'
alias vdir='ls --color=auto --format=long'
alias grep='grep --color=auto'
alias fgrep='fgrep --color=auto'
alias egrep='egrep --color=auto'
fi
# inventions
alias fgg=jobs
alias ghist='history|grep'
alias lf='find -type f|sort'
alias load='cat /proc/loadavg'
alias meminfo='cat /proc/meminfo'
# Kalendar
alias kal='clear;echo -n "Heutiges Datum: ";date;echo;cal -3m'
#make tree a little cooler looking.
alias tree="tree -CAFa -I 'CVS|rhel.*.*.package|.svn|.git' --dirsfirst"
alias processes="ps axMuc | egrep '^[a-zA-Z0-9]'"
# command-line perl prog
alias pie="perl -p -i -e "
################## Begin functions from http://www.johnlawrence.net/code/?f=sfbashrc ###################################
# directory tree - http://www.shell-fu.org/lister.php?id=209
alias dirf='find . -type d | sed -e "s/[^-][^\/]*\// |/g" -e "s/|\([^ ]\)/|-\1/"'
#calendar with today highlighted - http://www.shell-fu.org/lister.php?id=210
alias tcal='cal | sed "s/^/ /;s/$/ /;s/ $(date +%e) / $(date +%e | sed '\''s/./#/g'\'') /"'
# count files by type - http://www.shell-fu.org/lister.php?id=173
alias ftype='find ${*-.} -type f | xargs file | awk -F, '\''{print $1}'\'' | awk '\''{$1=NULL;print $0}'\'' | sort | uniq -c | sort -nr'
# convert permissions to octal - http://www.shell-fu.org/lister.php?id=205
alias lo='ls -l | sed -e 's/--x/1/g' -e 's/-w-/2/g' -e 's/-wx/3/g' -e 's/r--/4/g' -e 's/r-x/5/g' -e 's/rw-/6/g' -e 's/rwx/7/g' -e 's/---/0/g''
# portscan in one line - http://www.shell-fu.org/lister.php?id=295
portscan(){
HOST="$1";for((port=1;port<=65535;++port));do echo -en "$port ";if echo -en "open $HOST $port\nlogout\quit" | telnet 2>/dev/null | grep 'Connected to' > /dev/null;then echo -en "\n\nport $port/tcp is open\n\n";fi;done
}
# print a random shell-fu tip - http://www.shell-fu.org/lister.php?id=192
alias shell-fu='links -dump "http://www.shell-fu.org/lister.php?random" | grep -A 100 -- ----'
# get an ordered list of subdirectory sizes - http://www.shell-fu.org/lister.php?id=275
alias dux='du -sk ./* | sort -n | awk '\''BEGIN{ pref[1]="K"; pref[2]="M"; pref[3]="G";} { total = total + $1; x = $1; y = 1; while( x > 1024 ) { x = (x + 1023)/1024; y++; } printf("%g%s\t%s\n",int(x*10)/10,pref[y],$2); } END { y = 1; while( total > 1024 ) { total = (total + 1023)/1024; y++; } printf("Total: %g%s\n",int(total*10)/10,pref[y]); }'\'''
# share current tree over the web - http://www.shell-fu.org/lister.php?id=54
alias webshare='python -c "import SimpleHTTPServer;SimpleHTTPServer.test()"'
################## End functions from http://www.johnlawrence.net/code/?f=sfbashrc ###################################
[…] es kürzer haben möchte, sollte sich meine bashrc anschauen, in der eine Funktion pg definiert ist, die mit dem Aufruf pg […]