[[:tux|{{ :linux.png?40|}}]]
===== Bash Prompt eigenen Bedürfnissen anpassen =====
Wer sich häufig mit SSH auf einem anderen Server einloggt, kommt sicherlich mal an den Punkt wo er Kommandos absetzt, welche nicht oder nicht wie erwartet funktionieren. Kann passieren wenn man sich irrtümlich auf einer anderen Maschine vermutet. Das kann ganz böse ins Auge gehen, wenn man auf der entfernten Maschine auch noch als root eingeloggt ist. Ich habe mir daher angewöhnt, den Prompt der Server, welche von mir remote administriert werden, farbig darzustellen. Dadurch wird mir bei jedem Kommando deutlich vor Augen geführt, dass ich auf einer "gefährlichen" Maschine arbeite. Aber bekanntlich hat jede Medaille zwei Seiten und die Schattenseite dieses Setups liegt klar darin, dass man sich auch vor Augen halten muss, dass man sicherlich hier und da doch wieder an einen Server sitzt, wo das **nicht** so eingestellt ist. Also dennoch Hirn eingeschaltet lassen...
==== Primärer Prompt ====
Die Variable >>$PS1<< legt das Aussehen des Primären Prompts fest, der immer dann ausgegeben wird, wenn die Shell auf die Eingabe eines Befehls wartet. Der Standard-Prompt schaut auf jeder Distribution ein wenig anders aus. Hier einige Beispiele:
Root bekommt auf einem Linux Debian System zB folgenden Prompt:
gallery:~# echo $PS1
PS1='\h:\w\$ '
Ein normaler User auf einem Linux Debian System bekommt zB folgenden Prompt:
pronto@vmdebian3:~$ echo $PS1
\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$
Eine Bash auf Darwin bzw. Mac OSX präsentiert sich zB so:
pronto-macpro:~ pronto$ echo $PS1
\h:\W \u\$
\\ \\
==== Zusammenstellung der Prompt-Variablen $PS1 ====
Folgende Sonderzeichen in >>$PS1<< (und den anderen Prompt-Variablen) setzen
spezielle und variable Komponenten im Prompt ein:
^ Zeichen ^ Bedeutung ^
| \e | ESC-Zeichen [escape] |
| \h | Rechner-Name bis zum ersten "." [host] |
| \H | Vollständiger Rechner-Name (FQHN) [Host] |
| \j | Anzahl Hintergrundprozesse [jobs] |
| \l | Terminalname (Teil nach letztem "/") [l] |
| \u | Benutzer-Name [user] |
| \w | Vollständiges Arbeitsverzeichnis [working directory] |
| \W | Arbeitsverzeichnis (Teil nach letztem "/") [Working directory] |
| \s | Shell-Name (basename $0) [shell] |
| \v | Bash-Version [version] |
| \V | Bash-Version (inkl. Release und Patchlevel) [Version] |
| \$ | "$"-Zeichen für normalen Benutzer, "#"-Zeichen für root |
| \# | Befehlszeilennummer (in aktueller Sitzung) |
| \! | Befehlszeilennummer (über Sitzungen hinweg) |
| \[ | Beginn nicht darstellbare Zeichen (bei Kommandolänge ignoriert!) |
| \] | Ende nicht darstellbare Zeichen (bei Kommandolänge ignoriert!) |
| \\ | Backslash |
\\
Des Weiteren sind noch folgende Farbcodes verfügbar:
^ Farbe ^ Code ^ Farbe ^ Code ^
|Black | 0;30 |Dark Gray | 1;30 |
|Blue | 0;34 |Bold Blue | 1;34 |
|Green | 0;32 |Bold Green | 1;32 |
|Cyan | 0;36 |Bold Cyan | 1;36 |
|Red | 0;31 |Bold Red | 1;31 |
|Purple | 0;35 |Bold Purple | 1;35 |
|Brown | 0;33 |Yello | 1;33 |
|Light Gray | 0;37 |White | 1;37 |
Nicht darstellbare ESC-Sequenzen müssen zwischen einem \[\e[ und einem \] eingeschlossen werden, Farb-Codes sollten zudem mit einem m abgeschlossen werden.
=== Beispiele: ===
Die Variable >>PS1='FooBar: '<< erzeugt folgenden Prompt. Das Leerzeichen am Ende zwischen den Hochkommas soll die folgenden Eingabe etwas vom Prompt abheben:
-> export PS1='FooBar: '
FooBar:
Natürlich ein blöder Prompt, keine Frage. Kommen wir zu nützlicherem. Folgende Variable erzeugt einen Prompt mit dem Login-Namen des aktuell angemeldeten Benutzers:
-> export PS1='\u > '
pronto >
Schaut schon brauchbarer aus, nehmen wir noch den Computernamen dazu:
-> export PS1='\u@\h > '
pronto@pronto-macpro >
Naja, zugegeben ein blöder Name aber zum demonstrieren reicht es, ich schreibe künftig den Computernamen aus und setze dafür ans Ende des Prompts die Variable \$. Das erzeugt bei einem normalen User ein $-Zeichen am Ende, root wird mit # abgeschlossen:
-> export PS1='\u@MacPro:\$ '
pronto@MacPro:$
Man möchte natürlich auch wissen wo man sich gerade im Dateisystem befindet. Ergänzen wir unseren Prompt um den Pfad zum aktuellen Arbeitsverzeichnis (\w):
-> export PS1='\u@MacPro:\w \$ '
pronto@MacPro:/Applications/Utilities $
Der komplette Pfad könnte sich aber mit zunehmender Verzeichnistiefe als kontraproduktiv erweisen, beschränken wir uns doch lieber auf das aktuelle Arbeitsverzeichnis (\W):
-> export PS1='\u@MacPro:\W \$ '
pronto@MacPro:Utilities $
Passt! Jetzt bringen wir ein wenig Farbe ins Spiel. Heben wir den Computernamen Rot ab. Die Syntax wird jetzt auf einen Schlag wesentlich komplexer. Wir müssen für die Farb-Codes eine ESC-Sequenz einleiten \[\e und den gewünschten Farbcode folgen lassen, den wir mit einem m abschließen ([1;31m\]):
-> export PS1='\u@\[\e[1;31m]MacPro:\W \$ '
pronto@MacPro:Utilities $ ls -l
Ups, jetzt läuft die Einfärbung durch, sogar die auf den Prompt folgende Eingabe ist eingefärbt. Dh wir müssen nach dem Computernamen die Farbe wieder zurückstellen (0m):
-> export PS1='\u@\[\e[1;31m\]MacPro\[\e[0m\]:\W \$ '
pronto@MacPro:Utilities $
Okay, jetzt sind wir da, wo wir hin wollten. Der Prompt beinhaltet nützliche Informationen wie den aktuellen Benutzer, das aktuelle Verzeichnis und den aktuellen Computernamen und den auch noch in Farbe. Sehr schön! Spielen Sie mit den Möglichkeiten und gestalten Sie sich Ihren Prompt nach Ihren Wünschen.
Jetzt haben wir aber noch das Problem, dass diese Einstellungen einen Neustart nicht überleben. Hier kommen die Konfigurationsdateien ins Spiel:
\\ \\
==== Konfigurations-Dateien ====
Man unterscheidet zwischen zwei Arten von Shells -> Die Login-Shell und die Nicht-Login-Shell: Die Login-Shell ist die erste die gestartet wird wenn sich ein Benutzer anmeldet. Alle weiteren Shells sind nur Sub-Shells der Login-Shell. Mit dem Befehl echo $0 kann man sehen ob man in einer Login-Shell oder einer Nicht-Login-Shell arbeitet. Ist die Ausgabe: >>-bash<< handelt es sich um eine Login-Shell bei >>bash<< ist es eine Nicht-Login-Shell.
**Konfigurations-Dateien der Login-Shell:**
Es gibt eine Konfigurationsdatei die für alle Benutzer gilt, und eine Reihe an Dateien die benutzerspezifisch ausgewertet werden. Die /etc/profile ist die zentrale Konfigurations-Datei für alle Benutzer. Wird eine Login-Shell gestartet wird erst die /etc/profile eingelesen. Dann wird im Home-Verzeichnis des Benutzers nach einer Datei namens ~/.bash_profile gesucht, wenn sie existiert, wird sie eingelesen. Existiert diese Datei nicht, wird nach der Datei ~/.bash_login gesucht. Wenn sie existiert wird sie eingelesen, wenn nicht, wird nach der ~/.profile gesucht. Wenn sie existiert wird sie eingelesen. Dann gibt es noch die ~/.bash_logout, die wenn sie vorhanden ist, beim Beenden der Login-Shell eingelesen wird.
Um jetzt unsere Prompt Einstellungen über einen Neustart am Leben zu erhalten, packen wir unsere oben erarbeitete Prompt Variable in die ~/.profile unseres Home-Verzeichnisses (~). Ist keine .profile und auch keine der anderen og Konfigurations-Dateien im Home Verzeichnis vorhanden, legen Sie einfach eine an.
# ~/.profile: executed by bash(1) for login shells.
export PS1='\u@\[\e[1;31m\]\h\[\e[0m\]:\W \$ '
**Konfigurations-Dateien der Nicht-Login-Shell:**
Hier ist der Ablauf nicht ganz so kompliziert. Die /etc/bash.bashrc gilt wieder für alle Benutzer und im Home-Verzeichnis eines Benutzers kann eine ~/.bashrc existieren.
Aber ab hier haben wir ein Problem. Wenn wir aus unserer Login-Shell heraus ein andere Shell starten (zB um den Benutzer kurzfristig zu wechseln), haben wir unsere Prompt-Konfiguration verloren, weil dadurch nur eine Sub-Shell gestartet wird. So wird anstelle der .profile die ~/.bashrc ausgewertet und hier wird erst mal der Standard-Prompt zu finden sein, wie die folgende Standard Linux Debian ~/.bashrc deutlich macht:
# ~/.bashrc: executed by bash(1) for non-login shells.
export PS1='\h:\w\$ '
Ersetzen Sie nun die Zeile export PS1='\h:\w\$ ' durch die selbe Zeile, welche Sie auch in die ~/.profile eingetragen haben, dann wird auch in den Sub-Shells der gewünschte Prompt eingestellt.
Diese Konfigurationsdateien sind im Prinzip Shell-Skripte, es kann jeder Befehl darin verwendet werden. Variablen die exportiert werden sind in Allen Sub-Shells gültig. [[:tux:profile|-> Aliase und Funktionen]] werden nicht an Sub-Shells weitergegeben werden, und müssen daher für Login- und Nicht-Login-Shells
gleichermaßen konfiguriert werden.
**Konfigurations-Datei neu einlesen:**
Um Änderungen an einer Konfigurationsdatei zu übernehmen, müssen Sie entweder die Shell neu starten oder mit dem source-Kommando neu einlesen:
pronto@MacPro:~ $ source ~/.profile
**Verwandte Artikel:**
[[:tux:profile|-> Shell Alias anlegen]]
[[:win:edit_prompt|-> (Windows) CMD Prompt anpassen]]
--- //pronto 2010/08/19 22:10//
{{keywords>bash linux debian login non-login shell}}