Einführung
In diesem Lab lernen Sie die Grundlagen der Verwaltung der Shell-Umgebung und Konfiguration unter Linux kennen. Sie beginnen mit der Erstellung von lokalen Variablen und Umgebungsvariablen und verwenden Befehle wie echo, export und env, um die wesentlichen Unterschiede in Bezug auf deren Gültigkeitsbereich und Verfügbarkeit innerhalb einer Shell-Sitzung zu verstehen.
Auf diesen Grundlagen aufbauend untersuchen Sie, wie Variablen und Aliase an Child-Shells (untergeordnete Shells) vererbt werden. Sie lernen außerdem, wie Sie den automatischen Export von Variablen mit der Option set -o allexport steuern und wie Sie Ihre individuellen Konfigurationen über verschiedene Sitzungen hinweg dauerhaft speichern, indem Sie die Datei .bashrc anpassen.
Lokale Variablen und Umgebungsvariablen erstellen und unterscheiden
In diesem Schritt lernen Sie, wie Sie Shell-Variablen erstellen und verwalten. In einer Linux-Shell wie der Zsh werden Variablen verwendet, um Informationen zu speichern. Es gibt zwei Haupttypen: lokale Variablen und Umgebungsvariablen.
- Eine lokale Variable (oder Shell-Variable) ist nur innerhalb der Shell verfügbar, in der sie erstellt wurde.
- Eine Umgebungsvariable ist nicht nur in der aktuellen Shell verfügbar, sondern auch in allen Child-Prozessen, die von dieser Shell aus gestartet werden.
Wir werden die Befehle echo, export und env verwenden, um mit ihnen zu arbeiten. Alle Befehle werden im Terminal ausgeführt.
Zuerst erstellen wir eine lokale Variable. Geben Sie in Ihrem Terminal (das sich bereits im Verzeichnis ~/project befindet) den folgenden Befehl ein, um eine Variable namens flower zu erstellen und ihr den Wert rose zuzuweisen. Beachten Sie, dass um das Gleichheitszeichen (=) herum keine Leerzeichen stehen dürfen.
flower=rose
Um zu überprüfen, ob die Variable erstellt wurde, können Sie den Befehl echo verwenden, um ihren Wert auszugeben. Das Dollarzeichen ($) vor dem Variablennamen weist die Shell an, die Variable durch ihren Wert zu ersetzen.
echo $flower
Sie sollten den Wert der Variablen im Terminal sehen:
rose
Prüfen wir nun, ob diese lokale Variable Teil der Systemumgebung der Shell ist. Der Befehl env listet alle Umgebungsvariablen auf. Wir können die Ausgabe per Pipe an grep weiterleiten, um nach unserer Variablen zu suchen.
env | grep flower
Dieser Befehl wird keine Ausgabe erzeugen. Dies ist das erwartete Ergebnis und bestätigt, dass flower eine lokale Variable und keine Umgebungsvariable ist.
Als Nächstes erstellen wir eine Umgebungsvariable. Der Vorgang ist ähnlich, aber wir verwenden den Befehl export. Dieser Befehl erstellt eine Variable und markiert sie so, dass sie an alle Child-Prozesse der aktuellen Shell weitergegeben wird. Erstellen wir eine Umgebungsvariable namens nut mit dem Wert almond.
export nut=almond
Verifizieren wir dies mit echo, genau wie zuvor.
echo $nut
Der Befehl gibt den Wert der Variablen nut aus:
almond
Prüfen wir nun mit dem Befehl env, ob sie in der Umgebung existiert.
env | grep nut
Diesmal findet und zeigt der Befehl die Variable an, was bestätigt, dass nut eine Umgebungsvariable ist:
nut=almond
Sie haben nun erfolgreich sowohl eine lokale Variable als auch eine Umgebungsvariable erstellt und den grundlegenden Unterschied in der Behandlung durch die Shell-Umgebung gesehen. Wir lassen diese Variablen für die Verwendung in den nächsten Schritten gesetzt.
Vererbung von Variablen und Aliasen in einer Child-Shell testen
In diesem Schritt untersuchen Sie, wie sich Variablen und Aliase verhalten, wenn Sie eine neue Shell aus Ihrer aktuellen Shell heraus starten. Diese neue Shell wird als "Child-Shell" (untergeordnete Shell) bezeichnet, und die ursprüngliche Shell ist die "Parent-Shell" (übergeordnete Shell). Dieses Konzept ist entscheidend, um zu verstehen, wie Shell-Umgebungen strukturiert sind und wie Skripte ausgeführt werden. Wir werden testen, ob die Variablen flower und nut aus dem vorherigen Schritt an eine Child-Shell weitergegeben oder "vererbt" werden.
Zuerst ermitteln wir die Prozess-ID (PID) unserer aktuellen Parent-Shell. Jeder Prozess unter Linux hat eine eindeutige PID. Sie können diese mit dem Befehl echo $$ anzeigen.
echo $$
Ihre Ausgabe wird eine Zahl sein, die die PID Ihrer aktuellen Shell darstellt. Zum Beispiel:
123
Starten Sie nun eine Child-Shell, indem Sie einfach zsh eingeben und die Eingabetaste drücken. Dies erstellt einen neuen Shell-Prozess innerhalb Ihres aktuellen Prozesses.
zsh
Sie befinden sich nun in einer neuen Shell-Sitzung. Um dies zu bestätigen, können wir den Befehl ps -f verwenden, der detaillierte Prozessinformationen anzeigt, einschließlich der Parent Process ID (PPID).
ps -f
Schauen Sie sich die Ausgabe an. Sie werden zwei zsh-Prozesse sehen. Die PID des neuen zsh-Prozesses sollte eine PPID haben, die mit der PID der Parent-Shell übereinstimmt, die Sie sich zuvor notiert haben.
UID PID PPID C STIME TTY TIME CMD
labex 123 1 0 10:00 pts/0 00:00:00 zsh
labex 456 123 0 10:01 pts/0 00:00:00 zsh
labex 457 456 0 10:01 pts/0 00:00:00 ps -f
In diesem Beispiel ist die neue Shell (PID 456) ein Kind der ursprünglichen Shell (PPID 123).
Testen wir nun die Variablen. Versuchen Sie in dieser Child-Shell, den Wert der lokalen Variablen flower anzuzeigen.
echo $flower
Der Befehl erzeugt keine Ausgabe. Das liegt daran, dass lokale Variablen auf die Shell beschränkt sind, in der sie erstellt wurden, und nicht an Child-Shells vererbt werden.
Überprüfen Sie als Nächstes die Umgebungsvariable nut.
echo $nut
Diesmal gibt die Shell den Wert der Variablen aus:
almond
Dies zeigt, dass Umgebungsvariablen im Gegensatz zu lokalen Variablen an Child-Shells vererbt werden.
Kehren wir nun mit dem Befehl exit zur Parent-Shell zurück.
exit
Sie sind nun zurück in Ihrer ursprünglichen Shell. Führen wir einen ähnlichen Test mit einem Alias durch. Ein Alias ist eine Abkürzung für einen Befehl. Erstellen Sie einen Alias namens ldetc, der ls -ld /etc ausführt.
alias ldetc='ls -ld /etc'
Überprüfen Sie, ob der Alias erstellt wurde, indem Sie alias eingeben.
alias ldetc
Sie sollten die Definition Ihres Alias sehen:
ldetc='ls -ld /etc'
Testen Sie nun den Alias, indem Sie ihn ausführen.
ldetc
Der Befehl führt ls -ld /etc aus und zeigt Ihnen die Details des Verzeichnisses /etc.
drwxr-xr-x 1 root root 4096 Oct 10 10:00 /etc
Öffnen Sie nun eine weitere Child-Shell, um zu sehen, ob der Alias vererbt wird.
zsh
Versuchen Sie in der neuen Child-Shell, den Alias ldetc zu verwenden.
ldetc
Sie erhalten eine Fehlermeldung, da Aliase, genau wie lokale Variablen, nicht an Child-Shells vererbt werden.
zsh: command not found: ldetc
Kehren Sie zur Parent-Shell zurück.
exit
Zum Abschluss räumen wir auf, indem wir den Alias mit dem Befehl unalias aus der Parent-Shell entfernen.
unalias ldetc
Verifizieren Sie die Entfernung, indem Sie versuchen, ihn erneut aufzulisten.
alias ldetc
Es wird nichts zurückgegeben.
Diese Übung hat Ihnen ein wichtiges Prinzip des Shell-Verhaltens gezeigt: Umgebungsvariablen werden an Child-Prozesse vererbt, lokale Variablen und Aliase hingegen nicht.
Automatischen Variablen-Export mit set -o allexport steuern
In diesem Schritt lernen Sie eine leistungsstarke Shell-Option namens allexport kennen. Normalerweise müssen Sie beim Erstellen einer Variablen explizit den Befehl export verwenden, um sie zu einer Umgebungsvariablen zu machen. Durch Aktivieren der Option allexport können Sie die Shell jedoch anweisen, jede neu definierte Variable automatisch zu exportieren. Dies kann eine praktische Abkürzung sein, insbesondere in Skripten, in denen alle Variablen für Subprozesse verfügbar sein müssen.
Shell-Optionen sind interne Einstellungen, die das Verhalten Ihrer Shell ändern. Sie können sie mit set -o [optionsname] einschalten und mit set +o [optionsname] ausschalten.
Prüfen wir zunächst den aktuellen Status der Option allexport. Sie können alle Shell-Optionen auflisten und mit grep nach allexport filtern.
set -o | grep allexport
Standardmäßig ist diese Option deaktiviert. Die Ausgabe zeigt den Status als off an:
allexport off
Aktivieren wir nun die Option allexport.
set -o allexport
Überprüfen Sie, ob sich die Einstellung geändert hat, indem Sie den Prüfbefehl erneut ausführen.
set -o | grep allexport
Diesmal bestätigt die Ausgabe, dass die Option auf on steht:
allexport on
Wenn allexport aktiviert ist, wird jede Variable, die Sie erstellen, automatisch zu einer Umgebungsvariablen. Testen wir das. Erstellen Sie eine neue Variable namens truck, ohne den Befehl export zu verwenden.
truck=chevy
Prüfen Sie nun mit dem Befehl env, ob truck in der Umgebung existiert.
env | grep truck
Sie werden sehen, dass die Variable truck aufgelistet wird, obwohl Sie export nicht verwendet haben. Dies liegt daran, dass die Option allexport aktiv war.
truck=chevy
Diese Funktion kann sehr nützlich sein, aber es ist gute Praxis, sie wieder auszuschalten, wenn sie nicht mehr benötigt wird, um ein unbeabsichtigtes Exportieren von Variablen zu vermeiden. Schalten wir allexport aus.
set +o allexport
Überprüfen Sie abschließend, ob sie deaktiviert wurde.
set -o | grep allexport
Die Ausgabe zeigt wieder, dass die Option auf off steht.
allexport off
Alle neuen Variablen, die Sie ab jetzt erstellen, sind standardmäßig lokale Variablen, es sei denn, Sie verwenden explizit den Befehl export.
Shell-Optionen mithilfe der Datei .bashrc dauerhaft speichern
In diesem Schritt lernen Sie, wie Sie Ihre Shell-Anpassungen dauerhaft machen. Alle Aliase, Funktionen oder Shell-Optionen, die Sie setzen, sind temporär und gehen verloren, wenn Sie Ihre Terminal-Sitzung schließen. Um sie dauerhaft zu speichern, müssen Sie sie in eine Shell-Konfigurationsdatei eintragen.
Obwohl der Titel .bashrc erwähnt (die Konfigurationsdatei für die Bash-Shell), verwendet unsere Lab-Umgebung die Zsh-Shell. Die entsprechende Konfigurationsdatei für Zsh ist ~/.zshrc. Diese Datei ist ein Skript, das jedes Mal automatisch ausgeführt wird, wenn Sie eine neue interaktive Shell öffnen. Das macht sie zum perfekten Ort für Ihre persönlichen Einstellungen.
Wir werden dies üben, indem wir die Shell-Option noclobber dauerhaft aktivieren. Die Option noclobber verhindert, dass Sie versehentlich eine vorhandene Datei überschreiben, wenn Sie die Ausgabeumleitung (>) verwenden.
Verwenden wir zunächst den Texteditor nano, um die Option noclobber zu Ihrer Datei ~/.zshrc hinzuzufügen. Das Symbol ~ ist eine Abkürzung für Ihr Home-Verzeichnis /home/labex.
nano ~/.zshrc
Dieser Befehl öffnet die Datei ~/.zshrc im nano-Editor. Verwenden Sie die Pfeiltasten, um den Cursor ganz an das Ende der Datei zu bewegen, und fügen Sie die folgende Zeile hinzu:
set -o noclobber
Speichern Sie nun die Datei und beenden Sie nano. Drücken Sie dazu Strg+O (Speichern), bestätigen Sie den Dateinamen mit Enter und drücken Sie dann Strg+X zum Beenden.
Sie sind nun zurück an der Eingabeaufforderung. Prüfen wir, ob die Option noclobber in Ihrer aktuellen Shell aktiv ist.
set -o | grep noclobber
Die Ausgabe wird sein:
noclobber off
Warum ist sie aus? Weil Ihre aktuelle Shell-Sitzung die Änderungen, die Sie gerade an der Datei ~/.zshrc vorgenommen haben, noch nicht eingelesen hat. Die Datei wird nur beim Start einer neuen Shell gelesen.
Um dies zu beweisen, starten wir eine neue Child-Shell.
zsh
Sie befinden sich nun in einer neuen Shell. Prüfen wir hier den Status von noclobber.
set -o | grep noclobber
Diesmal wird die Ausgabe sein:
noclobber on
Dies bestätigt, dass neue Shells die Datei ~/.zshrc korrekt lesen und die Einstellungen anwenden. Verlassen Sie nun die Child-Shell, um zu Ihrer ursprünglichen Parent-Shell zurückzukehren.
exit
Wie können Sie also die Änderungen auf Ihre aktuelle Shell anwenden, ohne sie zu schließen und neu zu öffnen? Sie können den Befehl source verwenden, der die Befehle aus einer Datei im Kontext der aktuellen Shell liest und ausführt.
source ~/.zshrc
Der Befehl source hat nun die Zeile set -o noclobber aus Ihrer Konfigurationsdatei ausgeführt. Verifizieren wir, dass noclobber jetzt in unserer ursprünglichen Shell aktiviert ist.
set -o | grep noclobber
Die Ausgabe wird nun sein:
noclobber on
Sie haben erfolgreich gelernt, wie Sie Shell-Einstellungen durch Bearbeiten der Datei ~/.zshrc dauerhaft speichern und wie Sie diese Änderungen mit dem Befehl source auf Ihre aktuelle Sitzung anwenden.
Zusammenfassung
In diesem Lab haben Sie die grundlegenden Konzepte zur Verwaltung der Linux-Shell-Umgebung kennengelernt. Sie haben geübt, sowohl lokale Variablen zu erstellen, die auf die aktuelle Shell beschränkt sind, als auch Umgebungsvariablen, die von allen Child-Prozessen geerbt werden. Wichtige Befehle wie echo zum Anzeigen von Variablenwerten, export zum Erstellen von Umgebungsvariablen und env zum Auflisten dieser Variablen wurden eingesetzt. Das Konzept der Vererbung wurde weiter vertieft, indem eine Child-Shell gestartet wurde, um zu testen, welche Variablen und Aliase erfolgreich von der Parent-Shell weitergegeben wurden.
Darüber hinaus haben Sie Methoden zur Steuerung und dauerhaften Speicherung Ihrer Shell-Konfiguration untersucht. Sie haben die Option set -o allexport verwendet, um alle nachfolgend definierten Variablen automatisch zu exportieren, was den Prozess ihrer Bereitstellung für Child-Prozesse vereinfacht. Um sicherzustellen, dass Ihre benutzerdefinierten Variablen, Aliase und Shell-Optionen in allen zukünftigen Terminal-Sitzungen verfügbar sind, haben Sie gelernt, wie Sie diese Konfigurationen in die Startdatei .bashrc (bzw. .zshrc) einfügen und so Ihre Umgebungsanpassungen dauerhaft machen.



