Wenn Sie diese Seite in einer Suche gefunden haben, versuchen Sie wahrscheinlich, ein Problem mit der Ausführung von Bash zu lösen.
Es ist möglich, dass Ihre Umgebungs-Bash keine Umgebungsvariable festlegt und Sie nicht verstehen, warum. Möglicherweise haben Sie etwas in verschiedene Bash-Boot-Dateien oder in Profile oder in alle Dateien nach dem Zufallsprinzip gestopft, bis es funktioniert hat.
In jedem Fall geht es in diesem Hinweis darum, die Bash-Startprozedur so einfach wie möglich zu beschreiben, damit Sie Probleme lösen können.
Diagramm
Dieses Flussdiagramm fasst alle Prozesse beim Starten von Bash zusammen.

Schauen wir uns nun jeden Teil genauer an.
Login Shell?
Zuerst müssen Sie auswählen, ob Sie sich in der Login-Shell befinden oder nicht.
Die Anmeldeshell ist die erste Shell, die Sie eingeben, wenn Sie sich für eine interaktive Sitzung anmelden. Die Login-Shell benötigt keinen Benutzernamen und kein Passwort. Sie können den Start der Anmeldeshell erzwingen, indem
--login
beim Aufrufen von
bash
das Flag
--login
hinzufügen. Beispiel:
bash --login
Die Login-Shell konfiguriert die Basisumgebung, wenn Sie die Bash-Shell zum ersten Mal ausführen.
Interaktiv?
Dann bestimmen Sie, ob die Shell interaktiv ist oder nicht.
Dies kann durch das Vorhandensein der
PS1
Variablen überprüft werden (sie legt die Befehlseingabefunktion fest):
if ["$ {PS1-}"]; dann
Echo interaktiv
sonst
Echo nicht interaktiv
fi
Oder prüfen Sie, ob die Option
-i
mithilfe einer speziellen Bindestrichvariablen in bash festgelegt wurde, zum Beispiel:
$ echo $ -
Wenn die Ausgabe ein
i
, ist die Shell interaktiv.
In der Login-Shell?
Wenn Sie sich in der Login-Shell befinden, sucht bash nach der Datei
/etc/profile
und wird ausgeführt, falls vorhanden.
Anschließend wird in der folgenden Reihenfolge nach einer dieser drei Dateien gesucht:
~ / .bash_profile
~ / .bash_login
~ / .profile
Wenn es eines findet, startet es es und überspringt die anderen.
In einer interaktiven Shell?
Wenn Sie sich in einer interaktiven Shell ohne Login befinden (Nicht-Login-Shell), wird davon ausgegangen, dass Sie die Login-Shell bereits besucht haben, die Umgebung konfiguriert ist und vererbt wird.
In diesem Fall werden die folgenden zwei Dateien der Reihe nach ausgeführt, sofern vorhanden:
/etc/bash.bashrc
~ / .bashrc
Keine einzige Option?
Wenn Sie sich weder in der Login-Shell noch in der interaktiven Shell befinden, ist Ihre Umgebung tatsächlich leer. Dies führt zu großer Verwirrung (siehe Cron-Jobs unten).
In diesem Fall
BASH_ENV
bash die Variable
BASH_ENV
Ihrer Umgebung und führt die entsprechende Datei aus, die dort aufgeführt ist.
Typische Schwierigkeiten und Faustregeln
Cron Jobs
In 95% der Fälle habe ich das Debuggen des Bash-Starts durchgeführt, da der Cron-Job nicht wie erwartet funktioniert.Diese verdammte Aufgabe
funktioniert gut, wenn ich sie in der Befehlszeile ausführe, schlägt jedoch fehl, wenn sie in crontab ausgeführt wird .
Es gibt
zwei Gründe :
- Cron-Jobs sind nicht interaktiv.
- Im Gegensatz zu Befehlszeilenskripten erben Cron-Jobs die Shell-Umgebung nicht.
Normalerweise bemerken Sie nicht, dass das Shell-Skript nicht interaktiv ist, da die Umgebung von der interaktiven Shell erbt. Dies bedeutet, dass alle
PATH
und
alias
wie erwartet konfiguriert
alias
.
Aus diesem Grund müssen Sie häufig einen bestimmten
PATH
für die Cron-Aufgabe festlegen, wie hier:
* * * * * PATH = $ {PATH}: / path / to / my / program / folder myprogram
Skripte, die sich gegenseitig aufrufen
Ein weiteres häufiges Problem besteht darin, dass Skripte fälschlicherweise so konfiguriert sind, dass sie sich gegenseitig aufrufen. Zum Beispiel bezieht sich
/etc/profile
auf
~/.bashrc
.
Normalerweise passiert dies, wenn jemand versucht hat, einen Fehler zu beheben, und alles schien zu funktionieren. Wenn Sie diese verschiedenen Sitzungstypen trennen müssen, treten leider neue Probleme auf.
Sandbox Docker Image
Um mit dem Shell-Start zu experimentieren, habe ich ein Docker-Image erstellt, mit dem Sie den Shell-Start in einer sicheren Umgebung debuggen können.
Start:
$ docker run -n bs -d imiell/bash_startup $ docker exec -ti bs bash
Dockerfile ist
da .
So erzwingen Sie die Anmeldung und simulieren die Anmeldeshell:
$ bash --login
So überprüfen Sie den Variablensatz
BASH_ENV
:
$ env | grep BASH_ENV
Zum Debuggen von
crontab
wird jede Minute
crontab
einfaches Skript ausgeführt (in
/root/ascript
):
$ crontab -l $ cat /var/log/script.log