Verwalten der Shell-Umgebung und Konfiguration unter Linux

CompTIABeginner
Jetzt üben

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.