Bashrc
Der richtige Titel für diesen Artikel lautet .bashrc. Dies ist aus technischen Gründen derzeit jedoch nicht möglich.
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 es 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), undm an 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 ds 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, schlagt 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/vc/1" ]; 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 lexa='ssh -p2211 lexa.gotdns.org' alias jana='ssh -p2210 lexa.gotdns.org' alias pdf='epdfview' alias z='gqview' alias ip="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