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
~/.bashrcund führt Befehle aus--norcaus, falls diese Datei existiert. Dies kann durch die Verwendung der Option--rcfileverhindert werden. Die Option~/.bashrcfile 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"; fiaber der Wert der Variablen
.profilewird 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').