Einführung
Programme benötigen häufig kleine Konfigurationswerte: ein Home-Verzeichnis, eine Sprache, einen Suchpfad oder eine Anwendungseinstellung. Linux-Prozesse erhalten viele dieser Werte über eine Umgebung, also eine Sammlung benannter Zeichenketten.
In diesem Lab bauen Sie das Konzept schrittweise auf. Zuerst erstellen Sie eine Variable, die nur zur aktuellen Shell gehört. Danach exportieren Sie eine Variable an Kindprozesse, untersuchen Standardvariablen, erweitern PATH und sorgen dafür, dass Einstellungen in zukünftigen Zsh-Sitzungen verfügbar sind. Jeder Schritt erzeugt eine überprüfbare Datei oder ein sichtbares Kommandoergebnis. So können Sie kontrollieren, was die Shell tatsächlich ausgeführt hat.
Eine Shell-Variable erstellen und erweitern
In diesem Schritt erstellen Sie eine Shell-Variable und beobachten, wie sich Anführungszeichen auf die Expansion auswirken.
Eine Shell-Variable verbindet innerhalb der aktuellen Shell einen Namen mit einem Wert. Bei einer Zuweisung dürfen um = keine Leerzeichen stehen. Durch die Anführungszeichen bleibt das enthaltene Leerzeichen im Wert erhalten:
cd /home/labex/project/environment-lab
course_name="Linux for Noobs"
Wenn Sie dem Namen ein $ voranstellen, weist das die Shell an, den Namen durch seinen Wert zu ersetzen:
echo "$course_name"
Doppelte Anführungszeichen erlauben die Expansion und behandeln das Ergebnis als ein Argument. Einfache Anführungszeichen bewahren das Dollarzeichen wörtlich. Vergleichen Sie beide Varianten:
printf 'double: %s\n' "$course_name"
printf 'single: %s\n' '$course_name'
Speichern Sie den expandierten Wert als überprüfbares Ergebnis:
printf 'course=%s\n' "$course_name" > shell-variable.txt
cat shell-variable.txt
Diese Variable existiert nur in der aktuellen Shell, solange sie nicht exportiert wird.
Die Vererbung an Kindprozesse beobachten
In diesem Schritt vergleichen Sie eine gewöhnliche Shell-Variable mit einer exportierten Variable innerhalb eines Kindprozesses.
Jedes Kommando läuft in einem Prozess. Ein Kindprozess erhält exportierte Umgebungsvariablen von seinem übergeordneten Prozess, aber keine gewöhnlichen Shell-Variablen.
Wechseln Sie zum Arbeitsverzeichnis zurück und erstellen Sie jeweils eine Variable der beiden Arten:
cd /home/labex/project/environment-lab
local_message="visible only in this shell"
export SHARED_MESSAGE="visible in child processes"
Erstellen Sie einen kleinen Bash-Kindprozess, der beide Namen ausgibt. Der quotierte Here-Document-Marker verhindert, dass die aktuelle Shell die Variablen beim Schreiben des Skripts expandiert:
cat > inspect-child.sh <<'EOF'
#!/bin/bash
printf 'local=%s\n' "${local_message:-<missing>}"
printf 'shared=%s\n' "${SHARED_MESSAGE:-<missing>}"
EOF
chmod +x inspect-child.sh
Führen Sie das Skript aus, leiten Sie die Ausgabe in eine Datei um und zeigen Sie anschließend den Dateiinhalt an. Durch die getrennten Kommandos ist klar erkennbar, welcher Schritt den Kindprozess startet und welcher das gespeicherte Ergebnis untersucht:
./inspect-child.sh > child-environment.txt
cat child-environment.txt
Die gewöhnliche Variable erscheint als <missing>, während SHARED_MESSAGE geerbt wird. Bestätigen Sie, dass der exportierte Name in der Umgebung vorhanden ist:
env | grep '^SHARED_MESSAGE='
Standardumgebungsvariablen untersuchen
In diesem Schritt untersuchen Sie Standardvariablen, die Ihr Benutzerkonto, das Arbeitsverzeichnis, das Terminal und den Kommandosuchpfad beschreiben.
Linux-Shells stellen normalerweise nützliche Standardvariablen bereit:
HOMEist Ihr Home-Verzeichnis.USERist der Name Ihres Benutzerkontos.SHELList Ihre konfigurierte Login-Shell.PWDenthält das aktuelle Arbeitsverzeichnis.PATHlistet die Verzeichnisse für die Kommandosuche, getrennt durch Doppelpunkte.TERMbeschreibt die Terminalfähigkeiten für interaktive Programme.
Geben Sie ausgewählte Werte mit printenv aus. Dieses Kommando liest exportierte Variablen anhand ihres Namens:
printenv HOME USER SHELL PWD TERM
PATH lässt sich übersichtlicher darstellen, wenn jeder Eintrag in einer eigenen Zeile steht. Leiten Sie den Wert durch tr, um jeden Doppelpunkt durch einen Zeilenumbruch zu ersetzen:
printf '%s\n' "$PATH" | tr ':' '\n'
Erstellen Sie aus Variablen, deren erwartete Werte in diesem Lab bekannt sind, einen stabilen Bericht:
cd /home/labex/project/environment-lab
printf 'HOME=%s\nUSER=%s\n' "$HOME" "$USER" > standard-environment.txt
cat standard-environment.txt
PATH um ein persönliches Kommando erweitern
In diesem Schritt fügen Sie PATH ein persönliches Verzeichnis für ausführbare Dateien hinzu und führen aus einem anderen Verzeichnis ein Kommando anhand seines Namens aus.
Wenn Sie ein Kommando ohne Schrägstrich eingeben, durchsucht die Shell die Verzeichnisse in PATH von links nach rechts. Sie können ein persönliches Verzeichnis für ausführbare Dateien hinzufügen, ohne den bisherigen Suchpfad zu ersetzen.
Erstellen Sie ein Kommando namens course-status:
mkdir -p "$HOME/bin"
cat > "$HOME/bin/course-status" <<'EOF'
#!/bin/bash
echo "Linux learning environment is ready"
EOF
chmod +x "$HOME/bin/course-status"
Hängen Sie das Verzeichnis an den aktuellen PATH an. Durch die Beibehaltung von $PATH bleiben die Standardkommandos erreichbar:
export PATH="$PATH:$HOME/bin"
Fragen Sie die Shell ab, welche Datei sie ausführen wird, und starten Sie das Kommando anschließend aus einem anderen Verzeichnis:
command -v course-status
cd /tmp
course-status
Speichern Sie die Ausgabe im Arbeitsverzeichnis des Labs:
course-status > /home/labex/project/environment-lab/path-command.txt
Einstellungen für zukünftige Zsh-Sitzungen dauerhaft speichern
In diesem Schritt konfigurieren Sie zukünftige Zsh-Sitzungen und unterscheiden zwischen einer dauerhaften Konfiguration und dem Zustand der aktuellen Shell.
Das Exportieren ändert den aktuellen Prozess und seine zukünftigen Kindprozesse. Es bearbeitet jedoch keine Konfigurationsdatei. Eine Einstellung ist in späteren Terminals nur dann vorhanden, wenn eine Startdatei sie erneut anlegt. Das LabEx Terminal verwendet Zsh. Die Startdatei für interaktive Zsh-Sitzungen ist ~/.zshrc.
Hängen Sie einen eindeutig markierten Block an. Jede export-Zeile erstellt bei jedem Start einer neuen interaktiven Zsh-Shell die entsprechende Umgebungseinstellung erneut. Diese einfache Version hält die Startdatei bewusst direkt: Sie übernimmt den bestehenden PATH und fügt das persönliche Verzeichnis am Ende hinzu.
cat >> "$HOME/.zshrc" <<'EOF'
## LABEX_ENV_LAB_START
export PROJECT_DIR="$HOME/project"
export PATH="$PATH:$HOME/bin"
## LABEX_ENV_LAB_END
EOF
Das Kommando source liest eine Datei in der aktuellen Shell ein. Laden Sie .zshrc jetzt erneut, damit Sie die Einstellungen verwenden können, ohne das Terminal zu schließen:
source "$HOME/.zshrc"
Bestätigen Sie, dass die neu eingelesene Variable verfügbar ist:
printf 'PROJECT_DIR=%s\n' "$PROJECT_DIR"
Sie sollten PROJECT_DIR=/home/labex/project sehen. Sie können außerdem einen neuen Zsh-Prozess starten, um zu prüfen, dass eine zukünftige Sitzung dieselben Einstellungen lädt. In zsh -ic fordert -i eine interaktive Shell an, damit .zshrc gelesen wird. -c übergibt das Kommando, das diese Shell ausführen soll. Leiten Sie die beiden Ausgabezeilen in future-shell.txt um und untersuchen Sie anschließend die Datei:
zsh -ic 'printf "PROJECT_DIR=%s\n" "$PROJECT_DIR"; command -v course-status' > /home/labex/project/environment-lab/future-shell.txt
cat /home/labex/project/environment-lab/future-shell.txt
In der ersten Zeile sollte /home/labex/project stehen. Die zweite Zeile sollte /home/labex/bin/course-status anzeigen.
Lernen Sie abschließend den Unterschied zwischen dem aktuellen Zustand und einer dauerhaften Konfiguration kennen. Erstellen und entfernen Sie eine temporäre Umgebungsvariable:
export TEMP_NOTE="remove me"
printenv TEMP_NOTE
unset TEMP_NOTE
printenv TEMP_NOTE
Das letzte printenv erzeugt keine Ausgabe und liefert einen Status ungleich null, weil der Name nicht mehr existiert. unset entfernt den Namen aus der aktuellen Shell. Wenn ein Name weiterhin in einer Startdatei definiert ist, wird er von einer zukünftigen Shell erneut angelegt, bis diese Konfigurationszeile entfernt wird.
Zusammenfassung
Sie haben die drei häufig verwechselten Mechanismen beobachtet: Eine Shell-Variable gehört zu genau einer Shell, export übergibt einen Wert an Kindprozesse, und eine Startdatei erstellt Einstellungen in zukünftigen Shells erneut. Außerdem haben Sie Standardumgebungsvariablen untersucht, PATH erweitert, ohne vorhandene Einträge zu verlieren, die Kommandosuche überprüft und mit unset einen temporären Zustand entfernt.



