Wenn Sie diese Seite bei einer Suche gefunden haben, versuchen Sie wahrscheinlich, ein Problem mit der Ausführung von Bash zu lösen.
Möglicherweise legt Ihre Bash-Umgebung keine Umgebungsvariable fest und Sie verstehen nicht, warum. Möglicherweise haben Sie etwas in verschiedenen Bash-Boot-Dateien oder -Profilen oder allen Dateien wahllos festgehalten, bis es funktionierte.
In jedem Fall geht es in diesem Hinweis darum, die Vorgehensweise zum Starten von Bash so einfach wie möglich zu gestalten, damit Sie mit Problemen umgehen können.
Диаграмма
Dieses Flussdiagramm fasst alle Prozesse beim Ausführen 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 Login-Shell ist die erste Shell, die Sie betreten, wenn Sie sich für eine interaktive Sitzung anmelden. Die Login-Shell erfordert keinen Benutzernamen und kein Passwort. Sie können den Start der Login-Shell erzwingen, indem Sie ein Flag hinzufügen --login
wenn angerufen bash
zum Beispiel:
bash --login
Die Login-Shell richtet die Basisumgebung ein, wenn Sie die Bash-Shell zum ersten Mal starten.
Interaktiv?
Anschließend legen Sie fest, ob die Shell interaktiv ist oder nicht.
Dies kann durch das Vorhandensein der Variable überprüft werden PS1
(es installiert die Befehlseingabefunktion):
if [ "${PS1-}" ]; dann echo interaktiv, sonst echo nicht interaktiv fi
Oder prüfen Sie, ob die Option aktiviert ist -i
, unter Verwendung einer speziellen Bindestrichvariablen -
in Bash, zum Beispiel:
$echo$-
Wenn in der Ausgabe ein Symbol vorhanden ist i
, dann ist die Shell interaktiv.
In der Login-Shell?
Wenn Sie sich in einer Login-Shell befinden, sucht Bash nach der Datei /etc/profile
und läuft, wenn es existiert.
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 Hülle?
Wenn Sie sich in einer Shell ohne Anmeldung befinden, wird davon ausgegangen, dass Sie sich bereits in einer Shell mit Anmeldung befanden. Die Umgebung ist konfiguriert und wird übernommen.
In diesem Fall werden die folgenden beiden Dateien der Reihe nach ausgeführt, sofern vorhanden:
/etc/bash.bashrc ~/.bashrc
Keine Option?
Wenn Sie sich weder in einer Login-Shell noch in einer interaktiven Shell befinden, ist Ihre Umgebung tatsächlich leer. Dies führt zu großer Verwirrung (siehe unten zu Cron-Jobs).
In diesem Fall schaut sich Bash die Variable an BASH_ENV
Ihre Umgebung und erstellt die entsprechende dort angegebene Datei.
Häufige Schwierigkeiten und Faustregeln
Zeitgesteuerte Aufgaben
In 95 % der Fälle debugge ich den Bash-Start, weil der Cron-Job nicht wie erwartet ausgeführt wird.
Diese verdammte Aufgabe Funktioniert einwandfrei, wenn ich es in der Befehlszeile ausführe, schlägt jedoch fehl, wenn ich es in crontab ausführe.
Hier zwei Gründe:
- Cron-Jobs sind nicht interaktiv.
- Im Gegensatz zu Befehlszeilenskripten erben Cron-Jobs nicht die Shell-Umgebung.
Normalerweise wird es Ihnen egal sein, dass ein Shell-Skript nicht interaktiv ist, da die Umgebung von der interaktiven Shell erbt. Das bedeutet, dass alles PATH
и alias
konfiguriert, wie Sie es erwarten würden.
Aus diesem Grund ist es oft notwendig, eine bestimmte Einstellung vorzunehmen PATH
für eine Cron-Aufgabe 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, /etc/profile
appelliert an ~/.bashrc
.
Dies geschieht normalerweise, wenn jemand versucht hat, einen Fehler zu beheben, und alles schien zu funktionieren. Wenn Sie diese verschiedenen Arten von Sitzungen trennen müssen, entstehen leider neue Probleme.
Sandboxed Docker-Image
Um mit der Ausführung einer Shell zu experimentieren, habe ich ein Docker-Image erstellt, das zum Debuggen der Ausführung einer Shell in einer sicheren Umgebung verwendet werden kann.
Start:
$ docker run -n bs -d imiell/bash_startup
$ docker exec -ti bs bash
Dockerfile befindet sich
So erzwingen Sie die Anmeldung und simulieren eine Anmelde-Shell:
$ bash --login
Um eine Reihe von Variablen zu testen BASH_ENV
:
$ env | grep BASH_ENV
Zum Debuggen crontab
Ein einfaches Skript wird jede Minute ausgeführt (in /root/ascript
):
$ crontab -l
$ cat /var/log/script.log
Source: habr.com