Was ist die .bashrc-Datei?
Unix-Shells beim Start lesen die .bashrc
-Datei und führen darin geschriebene Befehle aus. Was ist diese Datei und was führt sie aus?
Unix-Shells beim Start lesen die .bashrc
-Datei und führen darin geschriebene Befehle aus. Was ist diese Datei und was führt sie aus?
Eigentlich lautet bash
speziell .bashrc
(und /etc/bash.bashrc
). Es gibt viele verschiedene Shells.
Die bash man page (von Brian Fox und Chet Ramey; auch info page “Bash Startup Files” ) ist die maßgebliche Referenz:
Wenn eine interaktive Shell, die keine Login-Shell ist, gestartet wird, liest die bash die Datei
~/.bashrc
und führt Befehle aus--norc
aus, falls diese Datei existiert. Dies kann durch die Verwendung der Option--rcfile
verhindert werden. Die Option~/.bashrc
file zwingt die bash zum Lesen und Ausführen von Befehlen aus einer Datei anstelle vonBASH_ENV
.Wenn die bash nicht-interaktiv gestartet wird, um z.B. ein Shell-Skript auszuführen, sucht sie in der Umgebung nach der Variablen
PATH
, expandiert ihren Wert, wenn sie dort erscheint, und verwendet den expandierten Wert als Namen einer Datei zum Lesen und Ausführen. Die Bash verhält sich so, als würde der folgende Befehl ausgeführt:if [-n "$BASH_ENV"]; then . "$BASH_ENV"; fi
aber der Wert der Variablen
.profile
wird nicht zur Suche nach dem Dateinamen verwendet.
Die Datei besteht nur aus Shell-Befehlen. Sie wird normalerweise verwendet, um Prompts zu ändern, Umgebungsvariablen zu setzen und Shell-Prozeduren zu definieren. Traditionell wird zu diesem Zweck die Datei bash
verwendet, aber .bashrc
hat so viele Erweiterungen, dass sie eine eigene Startdatei für Benutzer benötigt, die bashisms in Startdateien setzen wollen.
“Nicht eine Anmeldeshell” bedeutet Dinge wie Skript-Starts und normalerweise Terminalfenster, die von Windowmanagern gestartet werden. Manchmal richte ich *nix-Systeme so ein, dass BASH_ENV
und .profile
nur sh
als Quelle haben. Solange Sie sich nicht außerhalb der POSIX-Shell-Befehle bewegen, werden Sie in jeder Shell die gleiche Initialisierung erhalten.
Besonders wertvoll ist es, wenn bash
wirklich system(3)
ist, was manchmal passiert. Verwenden Sie dazu:
. .profile
Ein Grund, warum das alles so komplex ist, liegt darin, dass manchmal Leute Dinge, die Ausgabe produzieren, in Shell-Startdateien legen oder Prompts bedingungslos setzen. Dies verursacht viele Probleme beim Ausführen von Shell-Programmen und Backtick-Befehlen innerhalb von Sprachen, ganz zu schweigen von bash
aus C-Programmen. Die Art und Weise, wie &007 gestartet wird, ist, glaube ich, so ausgelegt, dass es eine Datei gibt, in der die Ausgabe und die Einstellung der Prompts in Ordnung ist, und eine Datei, in der das nicht der Fall ist. Traditionell wird ein Laufzeittest durchgeführt, um Interaktivität zu unterscheiden, z.B. um zu prüfen, ob die Eingabeaufforderung eingestellt ist.
Wenn die Bash startet, führt sie die Befehle in einer Vielzahl verschiedener Skripte aus.
Wenn die Bash als interaktive Login-Shell aufgerufen wird, liest sie zunächst die Datei /etc/profile ein und führt Befehle aus, falls diese Datei existiert. Nachdem sie diese Datei gelesen hat, sucht sie nach ~/.bash_profile, ~/.bash_login und ~/.profile, in dieser Reihenfolge, und liest und führt Befehle aus der ersten Datei aus, die existiert und lesbar ist.
Wenn eine Login-Shell beendet wird, liest die Bash Befehle aus der Datei ~/.bash_logout, falls sie existiert, und führt sie aus.
Wenn eine interaktive Shell, die keine Login-Shell ist, gestartet wird, liest die Bash Befehle aus ~/.bashrc, falls diese Datei existiert, und führt sie aus. Dies kann durch die Verwendung der Option –norc verhindert werden. Die Option –rcfile file zwingt die Bash zum Lesen und Ausführen von Befehlen aus einer Datei anstelle von ~/.bashrc. http://en.wikipedia.org/wiki/Bash_(Unix_shell)
Hier sind einige Tricks und Tipps: http://www.cyberciti.biz/tips/howto-linux-unix-bash-shell-setup-prompt.html
Versuchen wir, den Prompt so einzustellen, dass er das heutige Datum und den Hostnamen anzeigen kann:
PS1="\d \h $ "
Er sollte verschiedene “Initialisierungs”-Befehle für Ihre Shell enthalten, z.B.:
alias ll='ls -l'
).