bash Environment Variablen Tutorial Teil 5

Environment Variablen steuern diverse Prozesse in der bash und konfigurieren sie. Mit PS1 hast du das Prompt bereits eine kennengelernt.

bash Logo/Environment Variablen
Dr. Dirk Colbry, Michigan State
Gnu-bash-logoCreative Commons Attribution-NonCommercial-ShareAlike 4.0 International License . loading=
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
7Arbeiten mit Dateien
8nano
9bash Scripting
10Variablen
11Verzweigungen (if)
12Schleifen
13Kommandozeilenparameter
14exit Codes bash Tutorial Teil 14
15von der Idee zum Script
16grep
17Piping und Redirection
18tee

Environment Variablen sind global während einer Login Session verfügbar. Einige werden während des Startprozess gesetzt und können sich auch verändern, andere werden erst während deiner Arbeit mit der bash initialisiert. Einige Variablen solltest du nicht verändern , wenn du nicht genau weist,was du tust.

Anzeigen kannst du dir alle Variablen mit ihren aktuellen Werten mit dem Kommando printenv. Um es übersichtlicher zu machen, lasse die Liste noch sortieren.

printenv|sort

Das Ergebnis ist eine Liste von Variablen, die nicht mehr in mein Terminalfenster passt.

Olli Graf - raspithek.de
env-list-sorted-1Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License . loading=
Screenshot der sortierten Environment Variablen

Da ich nicht alle Variablen erklären kann, schränke ich die Liste etwas ein. Du musst dich nicht ärgern, wenn du die Kommandos noch nicht verstehst, sie werden in späteren Tutorialteilen vorkommen und dir erklärt werden.

printenv |sort |grep -E "HOME|SHELL|PWD|PATH|_|USER|LANG|OLDPW"|grep -v XDG

Die Kommandosequenz gibt die sortierte Liste von Environment Variablen aus und filtert sie so, dass nur noch die Variablen angezeigt werden, die „HOME“, „SHELL“, „PWD“, „PATH“, „_“, „USER“, „LANG“ und „OLDPW“ enthalten. Danach werden noch alle Variablen aussortiert, die „XDG“ enthalten, da sie für die grafische Benutzeroberfläche sind. Das macht die Liste deutlich kürzer.

Die gefilterte Liste
Olli Graf - raspithek.de
env-list-filtered-2Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License . loading=
Die gefilterte Liste

Was diese Variablen bewirken, erkläre ich dir nun im einzelnen.

COLUMNS und LINES

Haben bei mir gerade die Werte 150 und 33 und zeigen an, wie viele Zeichen (150) auf wie viele Zeilen (33) im Terminalfenster passen. Bei Änderung der Größe des Terminalfensters ändern sich auch diese Werte.Diese beiden Variablen sind in erster Linie dann interessant, wenn du interaktive Programme für die bash schreibst, wie z.B. raspi-config.

DBUS_SESSION_BUS_ADDRESS

Diese Variable wird vom dbus-daemon benutzt und du solltest sie nicht verändern. Sie konfiguriert, über welche Adresse der DBus des Desktopmanager kommuniziert.

HOME

Hier wird beim Login festgelegt, wo das Homeverzeichnis des aktuellen Users zu finden ist. In der Regel ist dies /home/username, hier konkret dann /home/pi, der Wert wird aus /etc/passwd übernommen und kann da permanent geändert werden, um beispielsweise das Homeverzeichnis von der MicroSD Karte auf ein NAS zu verlagern.

LANG

LANG enthält die konfigurierte Sprache des Systems. Bei mir ist sie auf de_DE.UTF-8 gesetzt, also deutsch mit UTF-8 Kodierung.

Der Wert dieser Variable wird aus der Datei /etc/locale.gen gelesen, die über raspi-config unter Localisation Options >> Locale konfiguriert wird.

LS_COLORS

Diese Variable bezieht sich speziell auf den ls Befehl und legt fest, in welcher Farbe bestimmte Dateitypen anzeigt werden sollen. Hier kommen die ANSI-Codes zum Einsatz. Der Inhalt der Variable ist zu lang, deshalb zeige dir nur exemplarisch einige Teile. di=01;34 gibt Directories in blau aus und x=01;32 zeigt ausführbare Dateien in grün an. Ansonsten sind hier noch eine Menge Farbcodes für bestimmte Dateitypen definiert. Die verschiedenen Typklassen sind bspw. durch *.jpg=01;35 definiert werden durch einen Doppelpunkt voneinander getrennt und du kannst sie dadurch erweitern. Ich habe mal ein paar Testdateien mit verschiedenen Endungen angelegt, um den Effekt zu zeigen.

Die Testdateien haben unterschiedliche Farben, je nach Dateiendung
Olli Graf - raspithek.de
env-ls-colored-4Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License . loading=
Die Testdateien haben unterschiedliche Farben, je nach Dateiendung

Initialisiert wird diese Variable durch das /usr/bin/dircolors und wird in der ~/.bashrc aufgerufen. Solltest du die Variable völlig zerschießen, kannst du sie durch Aufruf des Programms wieder herstellen.

MOTD_SHOWN

Hier wird festgelegt, über welches Verfahren beim Login die Message Of The Day (MOTD) angezeigt werden soll. Bei Raspberry Pi OS hat diese Variable in der Regel den Wert „pam“ für das Personal Authentication Module

Die MOTD sieht bei mir beim Login über ssh z.B. so aus:

Linux quimby 6.1.21-v8+ #1642 SMP PREEMPT Mon Apr  3 17:24:16 BST 2023 aarch64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent

Der Text wird zwei mehreren Einzeldateien zusammengesetzt. Die erste Zeile kommt durch den Aufruf

uname -snrvm

in die Ausgabe, die Zeile ist auch unter /run/motd.dynamic abgelegt. . Aufgerufen wird uname über /etc/update-motd.d/10-uname. Das Modul pam_motd.so ist in /etc/pam.d/sshd eingetragen:

session    optional     pam_motd.so  motd=/run/motd.dynamic

Der Text darunter ist statisch in /etc/motd abgelegt und du kannst ihn nach deinem eigenen Geschmack ändern.

NO_AT_BRIDGE

Diese Variable ist essenziell für Gnome und du solltest sie besser unangetastet lassen.

PATH

Die PATH Variable ist vielleicht die wichtigste Variable überhaupt, da sie festlegt, in welchen Verzeichnissen die bash nach ausführbaren Programmen suchen soll.

Auf meinem Raspberry Pi hat sie derzeit folgenden Inhalt:

/home/pi/.local/bin:/home/pi/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games

Du bemerkst, dass die einzelnen Pfade mit einem Doppelpunkt voneinander getrennt werden. Du kannst die Variable um eigene Pfade erweitern, in dem du z.B. in der ~/.bashrc etwas wie

export PATH=/pfad/zu/bin:${PATH}

einfügst und damit das fiktive Verzeichnis /pfad/zu/bin zu PATH dazu fügst. Bei der Eingabe eines Kommandos wird die bash zunächst in der Liste der internen Kommandos suchen und danach die einzelnen Verzeichnisse in PATH von vorne nach hinten durchgehen. Sicherheitstipp: Ich warne davor, mit .:${PATH} das aktuelle Verzeichnis in den Suchpfad mit aufzunehmen, weil dir dann u.U. jemand ein Schadprogramm unterschieben könnte!

PWD

In dieser Variable kannst du das aktuelle Verzeichnis abfragen, die Variable wird bei jedem cd Kommando neu gesetzt und ist direkt nach dem Login mit $HOME identisch.

SHELL

Diese Variable enthält Kommando mit Pfad der gestarteten Shell und sollte bei der bash auf /bin/bash gesetzt sein. Sie ist nützlich, um in eigenen Skripts abzufragen, dass sie wirklich im Kontext der bash laufen. Ich habe noch nie einen Grund gesehen, diesen Wert zu ändern.

SSH_CLIENT

Diese Variable enthält Informationen über die aktuelle ssh Session. Die Variable existiert nur in Login-Shells, die über ssh gestartet wurden. Bei mir hat sie aktuell den Wert „192.168.178.81 58976 22“ und sagt aus, dass der Login von der IP-Adresse 192.168.178.81 über Port 22 geschah und als Antwort-Port 58976 benutzt wird. Eine Änderung des Werts könnte dazu führen, dass die ssh Kommunikation nicht mehr funktioniert.

SSH_CONNECTION

Auch diese Variable beschreibt die ssh Verbindung und enthält neben Client-IP auch die IP des eigenen Geräts so wie den Port „192.168.178.81 58976 192.168.178.25 22

SSH_TTY

Hier steht mit „/dev/pts/0“ drin, über welche TTY Schnittstelle der ssh Login läuft.

USER

Der Name des eingeloggten Users. Solltest du in Ruhe lassen!

_

Diese spezielle Variable enthält das zuletzt ausgeführte Kommando. In unserem Beispiel ist sie auf „/usr/bin/printenv“ gesetzt, da dass das Kommando ist, das die Liste ausgibt. Das Sortieren und Filtern geschieht in nachgelagerten Kommandos und beeinflussen die Liste nicht mehr.

Du kannst dir den Inhalt jeder Variable mit dem echo Kommando ausgeben lassen. Variablen werden immer mit einen $ adressiert.

echo ${HOME}

gibt dir den Pfad des Homevereichnisses des aktuellen Users aus, beim Raspi meist /home/pi.

Unser Ausflug in die Welt der Environment Variablen ist etwas umfangreicher geworden als ich ursprünglich gedacht hatte und sollte jetzt zu einem Ende kommen.

Schreibe einen Kommentar

Creative Commons License
Except where otherwise noted, the content on this site is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
Olli Graf - raspithek.de
WordPress Cookie Hinweis von Real Cookie Banner