Bash im Detail ausführen

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.

Bash im Detail ausführen

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 bashzum 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 hier.

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

Kommentar hinzufügen