Bashrc

Aus wiki.archlinux.de


Die bash ist unter Arch Linux die Standard-Shell. Mittels der Datei „.bashrc“ kann man sich die bash konfigurieren und anpassen. Prinzipiell geht dies auch mit der „.bash_profile“ und weiteren Dateien. In diesem Artikel wird allerdings nur auf die „.bashrc“ eingegangen, was auch völlig ausreicht.

Voraussetzungen

Unter gewissen Voraussetzungen kann es vorkommen, dass die „.bashrc“ nicht verarbeitet wird. Dies kann daran liegen, dass anstelle der „.bashrc“ die „.bash_profile“ automatisch ausgeführt wird. Nun hat man zwei Möglichkeiten: Entweder, man schreibt die Dinge in die „.bash_profile“, oder man schreibt in die „.bash_profile“, dass die „.bashrc“ ausgeführt werden soll.

source .bashrc

Dies hat den Vorteil, dass man alles über die „.bashrc“ machen kann. Diese Datei wird wesentlich häufiger erwähnt, und man muss sich beim Konfigurieren nicht erst Gedanken darüber machen, ob und wo man etwas reinschreiben muss, da „.bash_profile“ auf einem so konfigurierten System ja nichts weiter macht, als „.bashrc“ zu starten.

Man kann auch einen Link anlegen, wovon aber abzuraten ist. Falls man doch irgendwann mal die „.bashrc“ und die „.bash_profile“ mit unterschiedlichen Inhalten füllen möchte, muss man nämlich erst wieder den Link entfernen und die Datei neu anlegen. Mit der Ausführungsanweisung erspart man sich im vorherein unnötige Arbeit.

Vorüberlegungen

Aufteilen

Man kann alles, was man anpassen will, direkt in die Datei schreiben. Dies hat allerdings den Nachteil, dass die Datei eventuell sehr umfangreich werden kann (siehe Beispiele weiter unten), und man schlicht irgendwann den Überblick verliert.

In der „.bashrc“ können praktisch alle Befehle verwendet werden, die man auch in der bash selbst verwenden kann. So kann man natürlich auch Dateien sourcen, sie also abarbeiten, ohne dafür einen eigenen Prozess (eine eigene Shell) zu starten.

source /datei/mit/viel/inhalt

So kann man Skripte – zum Beispiel Farbdefinitionen zum einfacheren Verwenden von Farben – auslagern. Vorteil ist natürlich, dass man die Datei selbst klein hält, aber dennoch viel Funktionalität integrieren kann. Zudem kann man die Dateien unabhängig voneinander bearbeiten.

Nachteil ist allerdings, dass man neben der „.bashrc“ noch mehrere Dateien hat, die zur Anpassung der bash verwendet werden.

Zentral definieren

Neben den User-Bezogenen Definitionsdateien gibt es unter „/etc/profile“ noch eine Definitions-Datei die standardmäßig für alle bash-Instanzen aller Benutzer verwendet wird.

In ihr werden grundlegende Dinge definiert. Man sollte hier nur etwas ändern, wenn man weiß, was es bewirkt. Man kann allerdings nach der letzten Zeile der Datei eigene Zeilen einfügen, diese werden dann ebenfalls bei jedem Start einer bash ausgeführt.

Vorteil ist, dass man die Definitionen für verschiedene Nutzer nur ein mal erstellen muss, Nachteil ist allerdings, dass man diese Datei bei einem Backup dann auch berücksichtigen muss, oder sie bei einem Update eventuell überschrieben wird. User-Bezogene Definitionen „überschreiben“ zudem die Definitionen in den systemweiten Konfigurationsdateien.

Wenn man den Rechner also alleine nutzt, oder nur wenige Nutzer hat, die das System mit eigenen Profilen nutzen, ist es sinnvoller, die nutzerbezogenen Konfigurationsdateien zu verwenden.

Gefahren

Es gibt drei Dinge, die man niemals und unter gar keinen Umständen in eine „.bashrc“ (und nebenbei gesagt auch in keine andere Datei, die automatisch ausgeführt wird) schreiben sollte, wenn man nicht zu 100 Prozent weiß, was man tut, und sich über die Konsequenzen von auftretenden Fehlern – sowie deren Behebung – völlig im Klaren ist.

  • exit
  • logout
  • bash

Da die Datei bei jedem bash-Start automatisch ausgeführt wird, würden diese Befehle dafür sorgen, dass man umgehend wieder ausgeloggt wird, bzw. dass die bash in Rekursion immer und immer wieder gestartet wird.

Um den Startvorgang der bash kurz zu halten, sollte man darauf achten, rechen- und zeitintensive Prozess-Starts aus der „.bashrc“ herauszuhalten. Es sollten nur einfache Befehle und Programmstarts verwendet werden. Dies spielt bei Hintergrundprozessen jedoch keine all zu große Rolle.

Beispiele

Neben den im Artikel bash beschrieben Funktionalitäten kann man in der „.bashrc“ noch weitere Dinge anpassen, eine Übersicht darüber bietet dieser Abschnitt.

Prompt anpassen

Das Prompt gliedert sich in vier Teile, PS1 bis PS4. Jeder dieser Teile wird zu einem bestimmten Zeitpunkt verwendet. Der Standard-Teil ist PS1, er definiert das Eingabeprompt. Standardmäßig wird das Eingabepromt von Arch Linux als „[user@host ~]$ “ dargestellt. und wie folgt definiert:

PS1='[\u@\h \W]\$ '

Möchte man dieses Promt jetzt anpassen, und zum Beispiel in ein extrem kurzes „$“ verwandeln, schreibt man in die „.bashrc“ einfach eine neue Definition. Die Original-Definition wird damit überschrieben.

PS1='$'

Natürlich ist dies nur ein vereinfachtes Beispiel. Weitere, sehr ausführliche Informationen, mit praxisnahen Beispielen bietet der Artikel Bash-Prompt anpassen hier im Wiki.

Programme starten

Man kann in der „.bashrc“ auch Programmstarts definieren. Man sollte hier aber aufpassen, da das Abarbeiten der .bashrc so lange angehalten wird, wie sich das Programm im Vordergrund befindet. Man muss also die Programme so starten, dass sie in den Hintergrund gebracht werden.

# Startet bei jedem bash-Start Thunderbird
# als Hintergrundprozess …

thunderbird &

Dies funktioniert allerdings nicht immer, zumal man mit dem Autostart von Programmen ja bewirken möchte, dass man das Programm sofort benutzen kann. Man sollte den Programmaufruf eines Vordergrundprogramms also immer ans Ende der „.bashrc“ legen. Zwar wird die Abarbeitung der Datei nach Beendigung des Programms fortgesetzt, wenn man aber innerhalb des Programms auf Dinge zugreifen will, die erst nach dem Programmaufruf in der „.bashrc“ definiert werden, schlägt dies fehl.

Es ist zu beachten, dass die Programme, die gestartet werden sollen, entweder selbst überprüfen, ob es eine grafische Anzeige gibt, oder aber, dass die Programme keine grafische Anzeige benötigen, da es sonst eine Fehlermeldung gibt, wenn man den Programmstart nicht selbst durch if-Abfragen abfängt.

Funktionen und Aliase

Funktionen und Aliase erweitern das Repertoire der vom System bereitgestellten Befehle um eigene Befehle. Wenn man nicht weiß, ob es sich um ein Alias oder ein Programm handelt, verwendet man „type“.

Aliase sind nach einem „unalias“ so lange nicht mehr verfügbar, bis man sie neu definiert. Im Falle der „.bashrc“ entweder durch das Sourcen dieser, oder durch ein erneutes Einloggen. Will man Aliase dauerhaft wieder entfernen, löscht man die Definition in der „.bashrc“ wieder.

Funktionen verhalten sich diesbezüglich genau so. Sie überschreiben gleichlautende Befehle, und sind so lange gültig, bis man sie mittels „unset -f“ entfernt.

Funktionen und Aliase überschreiben sich hingegen gegenseitig. Je nachdem, was zuletzt definiert wurde, ist entweder die Funktion, oder der Alias gültig. Was ein Befehl ist, kann mittels „type“ erfragt werden.

Aliase definieren

Wenn man häufig Programme mit immer gleichbleibenden Parametern ausführt, diese Programme aber keine Möglichkeit bieten, diesbezüglich schnell und einfach nutzerbezogen Einstellungen zu verwenden, kann man sich Aliase anlegen. Aliase sind nichts weiter als eine simple Ersetzung von Text, den man eingibt.

Wenn man beispielsweise häufig Dateien als tar.gz packt, wird man eventuell diesen Befehl verwenden:

tar -pczf archiv.tar.gz /was/zu/packen/ist

Man muss also jedes mal „tar -pczf“ tippen. Auf Dauer wird dies einiges an Zeit kosten. Wenn man sich dafür zum Beispiel einen Alias „tgz“ anlegt, reicht es, statt „tar -pczf“ einfach „tgz“ zu verwenden.

alias tgz='tar -pczf'

Dieser Alias ist ab dem Speichern der „.bashrc“ in allen ab diesem Zeitpunkt gestarteten standardmäßigen bash-Prozessen verfügbar. Will man mittels „ls“ zum Beispiel immer die Verzeichnisse zuerst angezeigt bekommen, definiert man sich einen entsprechenden Alias in der „.bashrc“.

alias ls='ls --group-directories-first'

Wenn man nun „ls“ eingibt, verwendet man automatisch den in der Datei definierten Alias für „ls“, der wiederum das Programm „ls“ mit einem Parameter startet.

Funktionen

Anders als Aliase sind Funktionen nicht bloß einfache Textersetzungen, sondern können auch Parameter entgegennehmen und verarbeiten. Innerhalb einer Funktion können beliebige, von der bash verarbeitbaren Befehle verwendet werden.

Mittels „cd“ wechselt man in Verzeichnisse, und mittels mkdir erstellt man sie. Wenn man nun häufig neue Verzeichnisse erstellt, könnte man das erstellen eines Verzeichnisses und das Wechseln in eben dieses mittels einer Funktionsdefinition in der „.bashrc“ erledigen.

function mkcd () {
  mkdir -p "$1"
  cd "$1"
}

Wenn man nun „mkcd /verzeichnis/das/erzeugt/werden/soll“ eingibt, wird dieses Verzeichnis, inklusive Eltern-Verzeichnissen erzeugt, und in dieses dann auch gleich hineingewechselt.

Exports

Wenn man in der „.bashrc“ eine Variable definiert, dann ist diese Variable in der aufgerufenen bash gültig. Programme, die man startet, können ohne weiteres nicht auf diese Variable zugreifen. Wenn man die Variable hingegen exportiert, ist sie auch den Programmen, die aufgerufen werden, zur Verwendung bereitgestellt.

$ var="Variable 1"
$ bash -c 'echo $var'

$ export var="Variable 1"
$ bash -c 'echo $var'
Variable 1
$ 

Zuerst wird die Variable „$var“ definiert. Es wird die Variable dann in einer neuen Bash, die als Kindprozess läuft referenziert (Zur Syntax siehe Wiki-Artikel zur bash). Da die Variable in dieser bash allerdings nicht gesetzt wurde, wird nur eine leere Zeile zurückgegeben, eben das „echo“. Dann wird die Variable exportiert, und der Vorgang nun wiederholt. Diesmal wird die Variable ausgegeben.

Alle Variablen, die anderen Programmen, als der bash, in der man sich gerade befindet, nach deren Start zur Verfügung stehen sollen, müssen exportiert werden.

Beispiele

Nachfolgend zwei Beispiele. Ein Beispiel ist relativ einfach gehalten, das andere Beispiel baut vor allem darauf auf, andere Dateien zu integrieren und nimmt komplexere Änderungen vor.

Eine Datei

alias ls='ls --group-directories-first'
alias cp='cp -aiv'
alias grep='grep --color=always'
alias tgz='tar -pczf'

PS1='\[\033[01;32m\]\u@\h\[\033[00m\]\[\033[1m\]:\[\033[01;34m\]\w\[\033[00m\]\[\033[1m\]$\[\033[00m\] '

export OOO_FORCE_DESKTOP=gnome

function psgrep () {
  ps aux | grep "$1" | grep -v "grep"
}

function mkcd () {
  mkdir -p "$1"
  cd "$1"
}

Mehrere Dateien

.bashrc

if [ "$(tty)" = "/dev/tty1" ]; then
  startx -- -nolisten tcp
  logout
fi

source .bashrc_contents/aliases
source .bashrc_contents/functions
source .bashrc_contents/colors
source .bashrc_contents/lscolors
source .bashrc_contents/variables

.bashrc_contents/aliases

alias pdf='epdfview'
alias z='gqview'
alias myip="wget -q -O - http://www.example.com/meineip.php"

alias ls='ls -vph --color=auto --group-directories-first --time-style="+%F, %T  "'
alias cp='cp -aiv'
alias grep='grep --color=always'

alias tgz='tar -pczf'
alias wg='weatherget -m -s GMXX0049'

.bashrc_contents/functions

function psgrep () {
  ps aux | grep "$1" | grep -v "grep"
}

function mkcd () {
  mkdir -p "$1"
  cd "$1"
}

.bashrc_contents/colors

red='\[\e[0;31m\]'
RED='\[\e[1;31m\]'
blue='\[\e[0;34m\]'
BLUE='\[\e[1;34m\]'
cyan='\[\e[0;36m\]'
CYAN='\[\e[1;36m\]'
NC='\[\033[0m\]'      # no color
black='\[\e[0;30m\]'
BLACK='\[\e[1;30m\]'
green='\[\e[0;32m\]'
GREEN='\[\e[1;32m\]'
yellow='\[\e[0;33m\]'
YELLOW='\[\e[1;33m\]'
magenta='\[\e[0;35m\]'
MAGENTA='\[\e[1;35m\]'
white='\[\e[0;37m\]'
WHITE='\[\e[1;37m\]'

.bashrc_contents/lscolors

# ACHTUNG! Die Umbrüche hier sind nur aus designtechnischen Gründen
# für das Wiki eingefügt worden und müssen beim Übernehmen wieder
# Entfernt werden!

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

.bashrc_contents/variables

PS1="$GREEN\u@\h$NC:$BLUE\w$NC$ "

setterm -blength 0

export OOO_FORCE_DESKTOP=gnome soffice

Siehe auch

Weblinks