bash Startvorgang Tutorial Teil 4

In diesem Teil möchte ich dir den bash Startvorgang bei einem Login über ssh näher bringen. Die Datei ~/.bashrc ist ein wichtiger Teil davon, allerdings ist es bis dahin ein „weiter“ Weg.

bash Logo, CC-BY-NC 4.0 Dr. Dirk Colbry, Michigan State University
1Einführung
2Der bash Prompt
3key bindings
4Der Startvorgang
5Environment Variablen
6builtin commands
7Schleifen

Der bash Startvorgang

Beim Startvorgang sind mehrere Dateien beteiligt, die du kennen solltest.

/etc/passwd

In der /etc/passwd ist neben UserID und Username auch die verwendete Shell vermerkt.

pi:x:1000:1000:,,,:/home/pi:/bin/bash
^           ^     ^     ^        ^               ^
|           |     |      |       |              |
|           |     |      |       |              |
|           |     |      |       |               +----------Login-Shell|           |     |      |         +-----------------------Homeverzeichnis
|           |     |      +-------------------------------Userinformationen
|           |     +--------------------------------------GroupID
|           +-------------------------------------------UserID
+------------------------------------------------------Username

In dem Beispiel für den Standarduser von Raspberry Pi OS siehst du folgende Einträge, die durch einen Doppelpunkt voneinander getrennt sind:

  • pi – Der Username, er steht immer an erster Stelle und wird zur Anmeldung benötigt.
  • x – Das Passwort. früher stand das Passwort des Users an dieser Stelle. Heutzutage steht dort das x und das eigentliche Passwort ist in /etc/shadow abgelegt.
  • 1000 – UserID, diese ID benutzt Linux zur Identifikation des Users.
  • 1000 – GroupID, der zweite nummerische Wert gibt die ID der Gruppe an, die diesem User zugeordnet ist, an. Sie muss nicht zwangsläufig mit der UserID übereinstimmen.
  • Userinformationen – hier können bei der Anlage eines Users Daten wie echter Name, Telefonnummer und Anschrift eingetragen werden. Ich lass diese meistens leer
  • Homeverzeichnis – das Heimatverzeichnis wird hier festgelegt, du könntest es auch auf ein Netzwerklaufwerk konfigurieren und ein gemeinsames Homeverzeichnis für alle Raspberry Pis benutzen.
  • Login-Shell – hier steht, welche Shell beim Login gestartet werden soll, /bin/bash ist die Bash.

/etc/profile

Das Skript /etc/profile wird von der bash als erstes gestartet, es ist systemweit und kann benutzt werden, um Konfigurationen für alle User des Raspberry Pi zu setzen. Als erstes wird für alle User die PATH Variable mit den Verzeichnissen gesetzt, in denen sich die ausführbaren Programme befinden.

if [ "$(id -u)" -eq 0 ]; then
  PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
else
  PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games"
fi
export PATH

Der root User (UserID == 0) hat eine andere $PATH als alle anderen.

Danach wird geprüft, ob die bash Variable PS1 gesetzt ist, falls diese nicht leer, handelt es sich um eine interaktive Login Shell und das Skript /etc/bash.bashrc wird gestartet.

if [ "${PS1-}" ]; then
  if [ "${BASH-}" ] && [ "$BASH" != "/bin/sh" ]; then
    # The file bash.bashrc already sets the default PS1.
    # PS1='\h:\w\$ '
    if [ -f /etc/bash.bashrc ]; then
      . /etc/bash.bashrc
    fi
  else
    if [ "$(id -u)" -eq 0 ]; then
      PS1='# '
    else
      PS1='$ '
    fi
  fi
fi

Zum Abschluss folgt noch ein Block, in dem alle Skripts, die unter /etc/profile.d liegen gestartet werden. falls du eigene Skripts im Startprozess der Bash unterbringen musst, ist dies der richtige Ort dafür. Sie müssen nur die Endung .sh haben, um berücksichtigt zu werden.

if [ -d /etc/profile.d ]; then
  for i in /etc/profile.d/*.sh; do
    if [ -r $i ]; then
      . $i
    fi
  done
  unset i
fi

Nach der Installation von Raspberry Pi OS sind dort bereits einige Skripts abgelegt. Da dies von OS zu OS unterschiedlich ist, betrachte ich diese in diesem Post nicht weiter.

Skripts in /etc/profile.d bei Raspberry Pi OS (bullseye)
Skripts in /etc/profile.d bei Raspberry Pi OS (bullseye)

/etc/bash.bashrc

Wie ich eben erwähnte, wird das Skript /etc/bash.bashrc nur bei Login-Shells ausgeführt und ist daher für Konfigurationen geeignet, die nur Login-Shells betreffen sollen. Hier wird der endgültige Prompt in PS1 definiert und das Skript bash_completion.sh gestartet, mit der die eingebaute Kommandovervollständigung erweitert werden kann.

~/.profile und ~/.bash_profile

Die bash selbst schaut nun im Homeverzeichnis des Users nach, ob dort die Datei .bash_profile existiert. Falls ja, wird diese gestartet, ansonsten ~./profile. Durch diesen Mechanismus kannst du Kommandos ausführen, die für jede Shell gelten (.profile) oder nur speziell bei der bash (.bash_profile) und kommt damit zum letzten Schritt.

~/.bashrc

In der ~/.bashrc werden die endgültigen Einstellungen für den User vorgenommen. Meistens sie der beste Weg für dich, Kommandos zu starten und Konfigurationen vorzunehmen. Bei der Anlage eines neuen Users wird eine Standardversion ins Homeverzeichnis kopiert, in der ich zunächst immer diese Änderung vornehme:

alias ll='ls -l'
alias la='ls -A'
alias l='ls -CF'

Damit habe kannst du dir ein Dateilisting mit allen Informationen ausgeben lassen, ohne immer irgendwelche Optionen mit zu übergeben. ll habe ich in anderen Posts schon benutzt.

Da der Startvorgang schwierig zu beschreiben ist, habe ich das mal in einem Ablaufplan grob visualisiert:

Der Startvorgang bis zur .bashrc
Der Startvorgang bis zur .bashrc

Das Wissen über den bash Startvorgang der bash hilft dir, die Shell noch besser für deine Bedürfnisse zu konfigurieren und effizienter zu nutzen.

Im nächsten Teil zeig ich dir, wie du deine bash Sitzung mit Hilfe von Environment Variablen konfigurieren kannst.

Schreibe einen Kommentar

Cookie Consent Banner von Real Cookie Banner