Tag Archives: bashrc

Konsolen-Logo

Prompt › Bash

Ich habe schon vor einiger Zeit über die “.bashrc” berichtet und hier die Installation meiner dotfiles [~/.*] vorgestellt.

Heute möchte ich an einigen Bildern zeigen wie die Bash aussieht nachdem man die bereits erwähnten dotfiles installiert und wie man diese nach seinen Wünschen anpasst.

bash_prompt

1.) der Code

.bashrc: Dies ist die Konfigurationsdatei der Bash, diese wird bei jedem Aufruf einer interaktiven Shell ausgeführt. In meiner .bashrc stehen zunächst einmal ein paar Informationen, wovon ich hier nur die entsprechenden Links nennen möchte, welche man sich einmal anschauen sollte:

http://www.kfirlavi.com/blog/2012/11/14/defensive-bash-programming/
www.commandlinefu.com/commands/browse/sort-by-votes
https://twitter.com/climagic

.bash_profile: Diese Datei hat die selbe Aufgabe wie die .bashrc, wird jedoch “eigentlich” nur für Login-Shells aufgerufen. In diesem Fall wird die Datei jedoch auch für interaktive Shells verwende, da wir diese in der .bashrc inkludiert haben.

for file in ~/.{path,colors,icons,exports,aliases,bash_complete,functions,extra,bash_prompt}; 
do [ -r "$file" ] && [ -f "$file" ] && source"$file" 
done 
unset file

In dieser Datei werden wiederum andere Shell-Konfigurationen geladen (siehe vorheriges Code-Beispiel), welche auch von anderen Shells (z.B.: der zsh) genutzt werden können.

Desweiteren werden einige Einstellungen in einer zweiten for-Schleife ausgeführt. Andere Einstellungen sind näher beschrieben bzw. nur für nicht root-User geeignet und werden daher einzeln ausgeführt.

 .bash_prompt: Wie wir im vorherigem Code-Ausschnitt sehen konnten, wird diese Datei zum Schluss geladen, so dass wir zuvor definierte Funktionen und Variablen verwenden können.

# Local or SSH session?
local remote=""
[ -n "$SSH_CLIENT" ] || [ -n "$SSH_TTY" ] && remote=1

Wir prüfen, ob es sich hier um ein lokales Terminal oder um eine SSH Verbindung handelt, so dass wir den Hostnamen nur anzeigen, wenn dieser auch benötigt wird.

# set the user-color
local user_color=$COLOR_LIGHT_GREEN           # user's color
[ $UID -eq "0" ] && user_color=$COLOR_RED     # root's color

Root-User bekommen in der Prompt einen Roten-Usernamen angezeigt.

PS: die User-ID (UID) ist in der passwd zu finden: “cat /etc/passwd”

# set the user
local user="\u"

Die Zeichenkette “\u” wird beim Aufruf der Bash-Prompt in den entsprechenden Usernamen umgewandelt.

PS: hier gibt es eine Übersicht über weiter Zeichenketten, welche von der Bash-Prompt verarbeitet werden können z.B. die Uhrzeit

# set the hostname inside SSH session
local host=""
[ -n "$remote" ] && host="\[$COLOR_LIGHT_GREEN\]${ICON_FOR_AT}\h"

Wie bereits erwähnt zeigen wir den Hostnamen (“\h”) nur an, wenn es sich um eine Remote-Verbindung handelt.

if [[ -n $remote ]] && [[ $COLORTERM = gnome-* && $TERM = xterm ]] && infocmp gnome-256color >/dev/null 2>&1; then
  export TERM='gnome-256color'
elif infocmp xterm-256color >/dev/null 2>&1; then
  export TERM='xterm-256color'
fi

256 Farben in der lokalen Shell verwenden.

# INFO:   Text (commands) inside \[...\] does not impact line length calculation which fixes stange bug when looking through the history
#         $? is a status of last command, should be processed every time prompt prints

Da der Bash-Prompt bestemmte Zeichen nicht mag und wir davon einige in der bereits inkludierten “.colors“-Datei verwendet haben, müssen wir diese Variablen nun hier escapen.

# Format prompt
export PS1="\`if [ \$? -eq 0 ]; then echo -e \[\$COLOR_GREEN\]\${ICON_FOR_TRUE}; else echo -e \[\$COLOR_RED\]\${ICON_FOR_FALSE}; fi\` \[$user_color\]${user}${host}\[$user_color\]:\[$COLOR_LIGHT_BLUE\]\w\[$COLOR_LIGHT_RED\]${ICON_FOR_ARROW_RIGHT}\$(__git_branch)\$(__svn_branch)\$(__git_dirty)\[$COLOR_NO_COLOUR\] "

Der Prompt wird in der Variable PS1 (“echo $PS1″) gespeichert und nach jedem Befehl auf der Kommandozeile neu aufgerufen / ausgeführt, daher rufen wir in der Variable wiederum Funktionen auf, so dass diese Funktionen ebenfalls erneut ausgeführt werden.

PS: “$?” muss als erstes ausgeführt werden, da dieser Befehl den Rückgabewert des letzten Kommandos zurückliefert

2.) Beispiele

bash_prompt_false

- Root-User wird rot gekennzeichnet

- “” anzeigen, wenn der letzte Befehl nicht korrekte funktioniert hat

 

bash_prompt_remote

- Anzeigen des Hostnamens nur bei Remoteverbindungen

- Repository-Branch (git, svn) anzeigen

-  Repository-Status anzeigen (! anfügen, wenn etwas nicht eingecheckt ist)

 

Links & Quellen:

http://wiki.ubuntuusers.de/Bash/Prompt
https://wiki.archlinux.de/title/Bash-Prompt_anpassen
http://ezprompt.net/

1 Star2 Stars3 Stars4 Stars5 Stars (4 votes, average: 5.00 out of 5)
Konsolen-Logo

my dotfiles

Habe meine dotfiles (Dateien im Home-Verzeichnis, welche mit einem “.” beginnen) mit anderen Quellen angereichert und diese auf github veröffentlicht. Wer möchte kann diese Einstellungen, Aliase, Funktionen für die “Linux-Shell” verwenden oder auch verbessern, indem man einen entsprechenden Fork von dem Projekt erstellt.

dotfiles_vimdotfiles

https://github.com/voku/dotfiles

Installation:

cd ~ && git clone https://github.com/voku/dotfiles.git && cd dotfiles && source bootstrap.sh

… wenn gewünscht kann man mit diesem kleinen Skript entsprechende ggf. benötigte Pakete nachinstallieren:

bash ~/dotfiles/firstInstall.sh

 

Update:

source bootstrap.sh

 

Anpassungen:

Wenn die Datei “~/.extra” existiert, wird diese zusammen mit den anderen Dateien verarbeitet. Man kann diese nutzen, um benutzerdefinierte Befehle ausführen zu lassen.

z.B.: “cat ~/.extra”

# Git credentials
# Not in the repository, to prevent people from accidentally committing under my name
GIT_AUTHOR_NAME = " Lars Moelleken "
GIT_COMMITTER_NAME = "$ GIT_AUTHOR_NAME "
git config - global user.name "$ GIT_AUTHOR_NAME "
GIT_AUTHOR_EMAIL = " lars@moelleken.org "
GIT_COMMITTER_EMAIL = "$ GIT_AUTHOR_EMAIL "
git config - global user.email "$ GIT_AUTHOR_EMAIL "

 

Erklärungen / Quellen:

http://suckup.de/linux/bashrc/
http://wiki.ubuntuusers.de/Bash/bashrc
http://suckup.de/linux/vi-howto/
http://vim.wikia.com/wiki/Example_vimrc
http://dotfiles.org/

1 Star2 Stars3 Stars4 Stars5 Stars (3 votes, average: 5.00 out of 5)
Konsolen-Logo

Glückskekse in der Muschel

Wer bei jedem Login in der bash einen Glückskeks-Spruch lesen will, kann mit folgendem Befehl Glückskeks installieren…

aptitude install fortunes fortunes-de

… nun müssen dies wir nur noch in der ~/.bashrc Datei einfügen:

# Sprueche in der bash
if [ -f /usr/games/fortune ]; then
        /usr/games/fortune
fi

 

z.B.:

Ein Theologe diskutiert mit einer Architektin:Er: Ich weiß nicht, warum Sie sich aufregen. Gott hat doch zuerst denMann gebaut und dann die Frau. Die Reihenfolge wäre damit dochgeregelt.Sie: Ja, ich mache auch immer zuerst eine Skizze.

1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
Konsolen-Logo

SSH-Hostnamen vervollständigen

Bereits vor einiger Zeit habe ich beschrieben, wie du die “bash” (Standard-Shell) an deine Bedürfnisse anpassen kannst. Heute zeige ich noch einen kleinen Trick, um Hostnamen im ssh-Befehl zu vervollständigen.

complete -W "host1 host2 host3" ssh


Um den Befehl im der bash einzubinden, schreiben wir diesen in die ~/.bashrc Datei und lagern die Hostnamen (pro Zeile – einen Hostname) in einer Datei aus, so dass wir diese ggf. schnell ergänzen können.

vim ~/.ssh/hosts
vim ~/.bashrc
complete -W "$(<~/.ssh/hosts)" ssh


Als alternative Shell sollte man sich auch einmal “zsh” anschauen. :-)

1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
Konsolen-Logo

.bashrc

Wer Einstellungen an der bash ändern möchte oder z.B. einige Kommandos bzw. die
passenden Parameter nur schwer behalten kann oder eher selten auf der
Kommandozeile arbeitet, für den sind Einträge in der .bashrc sehr hilfreich.

Global -> /etc/bash.bashrc

User -> ~/.bashrc

 

Download:

https://github.com/voku/dotfiles/blob/master/.bashrc

 

Es folgen einige Einträge welche man ggf. in der .bashrc eintragen kann

export

# Datum zum Historylog hinzufuegen
export HISTTIMEFORMAT="%F %T "
# History auf 3000 Eintraege erweitern
export HISTSIZE=3000
# keine doppelten Einträge speichern
export HISTCONTROL=ignoredups
LS_COLORS='no=00:fi=00:di=01;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:su=37;41:sg=30;43:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.svgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=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:*.svg=01; 35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:'
export LS_COLORS
# Source Globale Definitionen
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
# Schalte vervollstaendigung fuer Programme ein
if [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi

alias

alias checkupdates='sudo apt-get update'

-> aktualisiert die Quellen (sources.list)

alias mkdd='mkdir $(date +%Y%m%d)'

-> erstellt ein Verzeichnis mit angehängtem Datum (yyyymmdd)

alias launchpadkey='sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys'

-> fuegt einen neuen Key Launchpad PPAs fuer Ubuntu hinzu

z.B.: launchpadkey 4E5E17B5

alias grep='grep --color=auto'

-> Ergebnisse von grep werden nun farblich markiert

alias ls='ls --color=auto -Fh'

-> verleiht dem “ls”-Befehl Farbe

alias la='ls -laFh --color=auto'

-> zeigt alle Dateien und Verzeichnisse ausführlich an

alias ll='ls -lFh --color=auto --group-directories-first'

-> zeigt Dateien und Verzeichnisse ausführlich an

alias llr='ls -lartFh --color=auto --group-directories-first'

-> zeigt die zuletzt geänderten Dateien unten an

alias dir='ls --color=auto --format=vertical'

-> zeigt Dateien und Verzeichnisse an

alias vdir='ls --color=auto --format=long'

-> zeigt mehr Infos zu Dateien und Verzeichnissen an

alias tree='tree -Csu'

-> zeigt einen Verzeichnis-Baum an

alias timestamp='date "+%Y%m%dT%H%M%S"'

-> zeigt den aktuellen Timestamp im ISO 8601 Format an

alias lf='find ./* -ctime -1 | xargs ls -ltr --color'

-> zeigt rekursiv Dateien und Verzeichnisse die in der letzten Stunde anfasst wurden an

alias myip='GET http://www.whatismyip.com/automation/n09230945.asp && echo'

-> zeigt deine oeffentliche IP-Adresse an

alias ..='cd ../'

-> wechselt ein Verzeichnis nach oben

alias ::='cd ../..'

-> wechselt zwei Verzeichnisse nach oben

alias 'psx'='ps auxwf | grep'

-> zeigt die/den entsprechenden Prozess an

alias pst='pstree -Alpha'

-> zeigt die Prozessstruktur uebersichtlich an

alias psmy='ps -ef | grep $USER'

-> zeigt alle meine Prozesse an

alias lsport='sudo lsof -i -T -n'

-> zeigt die Ports an, welche die Applikationen verwenden

alias llport='netstat -nape --inet'

-> zeigt weitere Infos über die Ports an, welche die Applikationen verwenden

alias du='du -kh'

-> zeigt den Festplattenverbrauch eines Verzeichnisses leserlich an

alias df='df -kTh'

-> zeigt den kompletten Festplattenverbrauch leserlich an

function

# Netzwerk Info
netinfo ()
{
  echo "--------------- Network Information ---------------"
  /sbin/ifconfig | awk /'inet Adresse/ {print $2}'
  echo ""
  /sbin/ifconfig | awk /'Bcast/ {print $3}'
  echo ""
  /sbin/ifconfig | awk /'inet Adresse/ {print $4}'
  echo "---------------------------------------------------"
}
# entpacken von Komprimierten Dateien
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 >extra  ct<" ;;
         esac
  else
    echo "'$1' is not a valid file"
  fi
}
# zeigt alle Dateien in dem akuellen Verzeichnis an (rekursiev)
ff()
{
  find . -type f -iname '*'$*'*' -ls ;
}
# Finde Text in Dateien
fstr()
{
  OPTIND=1
  local case=""
  local usage="fstr: find string in files.
  Usage: fstr [-i] "pattern" ["filename pattern"] "
  while getopts :it opt
    do
        case "$opt" in
        i) case="-i " ;;
        *) echo "$usage"; return;;
        esac
  done
  shift $(( $OPTIND - 1 ))
  if [ "$#" -lt 1 ]; then
    echo "$usage"
        return;
  fi
  find . -type f -name "${2:-*}" -print0 |
  xargs -0 egrep --color=always -sn ${case} "$1" 2>&- | more
}
# Infos zu einer Datei ausgeben
file_information()
{
  if [ $1 ]; then
    PLACE=`type -path $1`
    if [ -z $PLACE ]; then echo "$1: not found"; return 1; fi
      echo $PLACE
          ls -l $PLACE
          file $PLACE
        ldd $PLACE
  else
      echo "Missing argument"
  fi
}
alias finfo=file_information
# ein Backup einer Datei anlegen (mit Datum)
file_backup()
{
  for FILE ; do
    [[ -e "$1" ]] && cp "$1" "${1}_$(date +%Y-%m-%d_%H-%M-%S)" || echo ""$1" not found." >&2
  done
}
alias fback=file_backup
# Ein komprimiertes Backup + Datum erstellen
packen()
{
tar czvf "$1-$(date +%y%m%d-%H%M%S).tar.gz" "$1" ;
}
# ssh Verbindung aufbauen + ein Logfile schreiben
logssh()
{
  ssh $1 | tee sshlog ;
}
# farblichen Bash-Prompt
shell_colored() {
local GRAY="[33[1;30m]"
local LIGHT_GRAY="[33[0;37m]"
local CYAN="[33[0;36m]"
local LIGHT_CYAN="[33[1;36m]"
local NO_COLOUR="[33[0m]"
local BLUE="[33[0;34m]"
local LIGHT_BLUE="[33[1;34m]"
local RED="[33[0;31m]"
local LIGHT_RED="[33[1;31m]"
local GREEN="[33[0;32m]"
local LIGHT_GREEN="[33[1;32m]"
local PURPLE="[33[0;35m]"
local LIGHT_PURPLE="[33[1;35m]"
local BROWN="[33[0;33m]"
local YELLOW="[33[1;33m]"
local BLACK="[33[0;30m]"
local WHITE="[33[1;37m]"

PS1="n${debian_chroot:+($debian_chroot)}$LIGHT_GREENu$LIGHT_BLUE@$LIGHT_GREENh$LIGHT_GRAY:$LIGHT_BLUEw$LIGHT_RED->$NO_COLOUR "
}
shell_colored
1 Star2 Stars3 Stars4 Stars5 Stars (3 votes, average: 4.67 out of 5)

Ubuntu benachrichtigt dich…

Dustin Kirkland, Core Developer vom Ubuntu Server hat etwas interessantes in seinem Blog geschrieben. Und zwar wie man sich über beendete Befehle in der Shell benachrichtigen lassen kann. Falls ein “make” oder “grep” … mal wieder etwas länger dauert, kann man beruhigt weiterarbeiten und wird per NotifyOSD darüber benachrichtigt, wenn der Befehl beendet wurde.

Dazu musst du als erstes folgende Datei editieren:

vim ~/.bashrc
alias alert_helper='history|tail -n1|sed -e "s/^\s*[0-9]\+\s*//" -e "s/;\s*alert$//"'
alias alert='notify-send -i /usr/share/icons/gnome/32x32/apps/gnome-terminal.png "[$?] $(alert_helper)"'
sudo apt-get install libnotify-bin
source ~/.bashrc

Und schon kannst du es testen, einfach den “alert”-Befehl inter deinen Befehl schrieben, fertig…

sleep 5; alert
1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)

Shell-Befehle anschauen und ausführen

In diesen Artikel beschreibe ich kurz wie man die Bash-History nutzt, dafür stellen wir als erstes einige Dinge in der “.bashrc“-Datei in unserm Home-Verzeichnis ein.

vim ~/.bashrc

 

#keine doppelten Eintraege hintereinander in die History schreiben

 

export HISTCONTROL=ignoreboth

 

#History Datei niemals ueberschreiben, sondern neue Eintraege unten anfuegen

 

shopt -s histappend

 

#Datum zum Historylog hinzufuegen

 

export HISTTIMEFORMAT="%F %T"

 

# History auf 3000 Eintraege erweitern export

 

HISTSIZE=3000

 

Befehl Beschreibung
fc -l zeigt die letzten Befehle in einer Liste an
Strg + L führt den clear-Befehl aus und säubert sozusagen die Konsole ;-) Die Befehle “reset”, “TERM=linux” und “loadkeys de” (amerikanischen Tastaturlayout – Bild) können einem auch weiterhelfen…
Strg + r sucht einen Befehl in der Bash-History (mehrmaliges drücken von Strg+r geht weiter in der History zurück)
Alt + . schreibt den letzten Parameter des letzen Befehls auf die Konsole
!$ schreibt den letzten Parameter des letzen Befehls auf die Konsole (Alt + .)
!! führt den letzten Befehl noch einmal aus
!string startet den letzten Befehl, der mit sting anfängt
!?string startet den letzten Befehl, der string enthält
^sting1^string2 wiederholt den letzten Befehl, wobei sting1 doch string2 ersetzt wird
1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)

Wikipedia in der Shell

Wer schnell etwas über z.B. DDR2 Speicher wissen möchte, braucht dafür nicht unbedingt einen Browser. ;-)

Installation:

sudo aptitude install wikipedia2text

Konfiguration:

wer den entsprechenden Artikel auf Wikipedia auf deutsch lesen möchte muss noch einen Parameter angeben.

wikipedia2text -l de DDR2 | less

ggf. kann man diese Parameter in der ~/.bashrc einfügen, sodass man diesen nicht immer wieder eintragen muss…

alias wikipedia2text='wikipedia2text -l de'

… oder man erstellt in der bashrc einen kleinen Funktionsaufruf.

wiki()
{
    wikipedia2text -l de $1 | less
}
1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)

Bash + Twitter

Übermittele deine Twitter-Nachrichten per Kommandozeile ->

curl -u user:password -d status=”deine Nachricht” http://twitter.com/statuses/update.xml

oder auch als Funktion in der .bashrc

tweet()
{
curl -u "$1" -d status="$2" "http://twitter.com/statuses/update.xml";
}
tweet user "deine Nachricht"

Nach der Bestätigung wirst du nach deinen Passwort gefragt und fertig.

Alternativ gibt es auch ein kleines Bash-Skript, mit welchem getwittert werden kann …

cheek.com/downloads/Tweet/

1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)