Bash-Start im Detail

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 

Source: https://habr.com/ru/post/de452410/


All Articles