Environment Variablen steuern diverse Prozesse in der bash und konfigurieren sie. Mit PS1
hast du das Prompt bereits eine kennengelernt.
1 | Einführung |
---|---|
2 | Der bash Prompt |
3 | key bindings |
4 | Der Startvorgang |
5 | Environment Variablen |
6 | builtin commands |
7 | Arbeiten mit Dateien |
8 | nano |
9 | bash Scripting |
10 | Variablen |
11 | Verzweigungen (if) |
12 | Schleifen |
13 | Kommandozeilenparameter |
14 | exit Codes bash Tutorial Teil 14 |
15 | von der Idee zum Script |
16 | grep |
17 | Piping und Redirection |
18 | tee |
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.
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.
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.
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.