/etc/profile
wird nur für Login-Shells aufgerufen, da dies der spezifische Zweck ist.
Wenn Sie möchten, dass ein Befehl für interaktive Shells ausgeführt wird, bei denen es sich nicht um Anmeldeshells handelt, und Sie verwenden bash
, geben Sie ihn in ~/.bashrc
oder ein /etc/bash.bashrc
.
Der Zweck der "Profil" -Dateien besteht darin, Befehle zu enthalten, die nur für Login-Shells ausgeführt werden sollten. Diese Dateien sind:
/etc/profile
, wird von allen Bourne-kompatiblen Shells (einschließlich bash
und dash
) ausgeführt, wenn sie als Anmeldeshell gestartet werden.
Skripte in /etc/profile.d
.
Dies gilt für Shells im Bourne-Stil, ist jedoch nicht in der Shell-Programmdatei selbst codiert. Befehle in /etc/profile
rufen sie vielmehr auf . /etc/profile
Enthält beispielsweise auf meinem Ubuntu 12.04-System die folgenden Zeilen:
if [ -d /etc/profile.d ]; then
for i in /etc/profile.d/*.sh; do
if [ -r $i ]; then
. $i
fi
done
unset i
fi
.profile
Wird im Ausgangsverzeichnis des Benutzers von Bourne-kompatiblen Shells ausgeführt, wenn diese als Anmeldeshell gestartet werden (sofern sie nicht überschrieben werden, siehe unten).
.bash_profile
oder .bash_login
im Home-Verzeichnis des Benutzers. Diese werden von anderen Shells als ignoriert bash
. Aber falls .bash_profile
vorhanden, bash
läuft es statt .profile
. Wenn .bash_profile
nicht vorhanden, aber .bash_login
vorhanden ist, wird dies anstelle von ausgeführt .profile
.
(Aber es ist üblich , .bash_profile
oder .bash_login
, wenn es vorhanden ist , geschrieben werden, um * explizit aufrufen .profile
.)
Der Vorteil von Shell-spezifischen Profildateien besteht darin, dass sie Befehle oder Syntax enthalten können, die nur für diese Shell gültig sind. Zum Beispiel kann ich den [[
Evaluierungsoperator in .bash_profile
/ verwenden, .bash_login
aber wenn ich ihn verwende .profile
und mich dann dash
als meine Shell anmelde, schlägt er fehl.
Was sollte in "Profil" -Dateien gehen
"profile" -Dateien sollten Befehle enthalten, die zu Beginn der Anmeldung nur einmal ausgeführt werden dürfen. (Dies schließt auch grafische Anmeldungen ein, da sie auch mit einer Anmeldeshell beginnen.) Wenn eine Shell interaktiv ist, ist der Benutzer, der sie ausführt, wahrscheinlich angemeldet, und daher hat sie wahrscheinlich einen Vorfahren (der sie gestartet hat oder was sie gestartet hat). oder fing damit an, etc.) das war eine Login-Shell.
Möglicherweise möchten Sie einen Befehl nur einmal ausführen, weil:
- Es gibt keinen Grund, es mehr als einmal pro Anmeldung auszuführen, es wäre ineffizient, oder
- Es würde zu einem unerwünschten Ergebnis führen, wenn es mehr als einmal pro Anmeldung ausgeführt würde.
Betrachten Sie als Beispiel für die zweite Situation, in der ein unerwünschtes Ergebnis auftreten würde, die folgenden Zeilen, die standardmäßig in jedem Benutzer angezeigt werden ~/.profile
:
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
PATH="$HOME/bin:$PATH"
fi
Angenommen, Sie haben mit SSH eine andere Shell ausgeführt (z. B. zsh
), irgendwann festgestellt, dass Sie vorübergehend zu bash
Ihrer Umgebung zurückkehren und diese beibehalten möchten (also bash
erneut ausgeführt, während Sie sich in der Shell befinden zsh
), und dann ein Programm wie mc
dieses ausgeführt, das eine Shell als Teil ausführt seiner Schnittstelle. Wenn bin
es in Ihrem Home-Ordner existiert und Ihr Benutzername ist james
, ist Ihre PATH
in der innersten Shell so etwas wie:
/home/james/bin:/home/james/bin:/home/james/bin:/home/james/bin:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
Das ist ineffizient und (was noch wichtiger ist) macht es schwierig, den Inhalt von zu verstehen PATH
.
Dies ist jedoch keineswegs eine Katastrophe. Soweit ich das beurteilen kann, würde in der Standardkonfiguration nichts Schlimmes passieren, wenn alle "Profil" -Dateien von interaktiven Shell-Quellen stammen . Da der Zweck von "Profil" -Dateien darin besteht, Befehle zu enthalten, die nur einmal pro Anmeldung ausgeführt werden sollen , kann ein Benutzer oder Administrator einem Profil Befehle hinzufügen, die nur beim Starten einer Anmeldeshell ausgeführt werden müssen.
Wo Befehle für jede auszuführende interaktive Shell abgelegt werden
Wenn Sie verwenden bash
, gibt es Dateien für Befehle, die in jeder interaktiven Shell ausgeführt werden sollen:
/etc/bash.bashrc
.bashrc
im Home-Verzeichnis des Benutzers.
Dies wird am häufigsten für Befehle verwendet, die
- wirken sich nur auf die Umgebung der Shell aus, in der sie ausgeführt werden - nicht einmal auf Kinderschalen oder
- sollte auch dann ausgeführt werden, wenn dies nicht die Anmeldeshell ist.
Beispielsweise sollte die Vervollständigung von Befehlszeilenregistern im Allgemeinen aktiviert sein, unabhängig davon, ob es sich bash
um die Anmeldeshell handelt oder nicht . Das erscheint also in ~/.bashrc
:
if [ -f /etc/bash_completion ] && ! shopt -oq posix; then
. /etc/bash_completion
fi
Dort gelten 1 und 2 beide: Dies überträgt sich nicht auf andere Shells, die in diesem ausgeführt werden, und die Tab-Vervollständigung sollte bash
auch dann funktionieren , wenn ich mich mit einer anderen Shell angemeldet habe.
Wo Befehle für Anmelde-Shells und interaktive Nicht-Anmelde-Shells abgelegt werden
Wenn Sie bash
einen Befehl in Anmelde-Shells und interaktiven Shells ausführen möchten und dies keine Anmelde-Shells sind, ist es im Allgemeinen ausreichend, ihn in /etc/bash.bashrc
oder einzufügen~/.bashrc
. Dies liegt daran, standardmäßig /etc/profile
und ~/.profile
führen Sie sie explizit. Zum Beispiel ~/.profile
hat:
# if running bash
if [ -n "$BASH_VERSION" ]; then
# include .bashrc if it exists
if [ -f "$HOME/.bashrc" ]; then
. "$HOME/.bashrc"
fi
fi
(Ebenso /etc/profile
Quellen /etc/bash.bashrc
für bash
.)
Daher werden sowohl "profile" als auch "rc" Dateien ausgeführt, wenn Sie eine interaktive bash
Shell starten (unabhängig davon, ob es sich um eine Anmeldeshell handelt oder nicht).
Wo Befehle in nicht interaktiven Shells ausgeführt werden sollen
Sie möchten wahrscheinlich keine Befehle für alle nicht interaktiven Shells angeben, die ausgeführt werden sollen. Sie werden jedes Mal ausgeführt, wenn ein Skript ausgeführt wird (vorausgesetzt, das Skript wird von der Shell ausgeführt, die Sie für die Ausführung konfigurieren).
Dies kann zu erheblichen Brüchen führen. Wenn Sie dies tun und auf dem System kein anderes Administratorkonto als das von Ihnen verwendete vorhanden ist, möchten Sie möglicherweise eines erstellen. das kann es einfacher machen, Fehler zu beheben.
In bash
werden die "rc" -Dateien tatsächlich ausgeführt, unabhängig davon , ob die Shell interaktiv ist oder nicht . Oben steht jedoch:
# If not running interactively, don't do anything
[ -z "$PS1" ] && return
Wenn Sie also Befehle benötigen, die auch in nicht interaktiven Shells wie denjenigen, die zum Ausführen von Skripten ausgeführt werden, automatisch ausgeführt werden, können Sie Ihre Befehle vor diesen Zeilen einfügen.
Starten einer Login-Shell
Beim Anmelden wird eine Anmeldeshell gestartet. Wenn eine danach gestartete Shell als Login-Shell fungieren soll , starten Sie sie mit dem -l
Flag (steht für l ogin ). Zum Beispiel:
Dies ist der beste Weg, um eine Login-Shell zu starten (ohne sich anzumelden), es sei denn, Sie möchten einen anderen Benutzer als Benutzer starten . Dann benutze:
sudo -i
für root
(Verwendung sudo -s
für eine nicht angemeldete, interaktive Root-Shell)
sudo -u username -i
für jeden Benutzer
su - username
für Nichtbenutzer root
( für eine nicht angemeldete, interaktive Root-Shell verwenden)su username
Was ist eine anfängliche Anmeldeshell?
Eine anfängliche Anmeldeshell entspricht einer Anmeldeshell . Überall in dieser Antwort steht "login shell", es könnte "inital login shell" stehen (außer in diesem Abschnitt, der aufgehört hätte, Sinn zu machen).
Ein Grund für den Begriff inital login shell ist, dass login shell auch in einem anderen Sinne verwendet wird - um zu identifizieren, welches Programm als Shell verwendet wird, die bei der Anmeldung ausgeführt wird. Dies ist der Sinn der Login-Shell zu sagen:
- " OpenBSD ‚s Standard - Login - Shell ist
ksh
, in Ubuntu, es ist bash
."
- Msgstr "Sie können Ihre Login - Shell mit ändern
chsh
."
Weitere Lektüre
In bash, the "rc" files are actually run whether the shell is interactive or not.
ist falsch. /etc/bash.bashrc wird von /etc/bash.profile ausgelöst.