103.1 Lektion 2
Zertifikat: |
LPIC-1 |
---|---|
Version: |
5.0 |
Thema: |
103 GNU- und Unix-Befehle |
Lernziel: |
103.1 Auf der Befehlszeile arbeiten |
Lektion: |
2 von 2 |
Einführung
Eine Betriebssystemumgebung umfasst die grundlegenden Werkzeuge — wie Kommandozeilen-Shells und manchmal eine GUI — die Sie benötigen, um Dinge zu erledigen. Aber Ihre Umgebung wird auch mit einer Reihe von Verknüpfungen und voreingestellten Werten bereitgestellt. Hier werden Sie lernen, wie man diese Werte auflistet, aufruft und verwaltet.
Finden Sie Ihre Umgebungsvariablen
Wie also identifizieren Sie die aktuellen Werte für jede der Umgebungsvariablen? Ein Weg besteht in der Ausführung des Befehls env
:
$ env DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus XDG_RUNTIME_DIR=/run/user/1000 XAUTHORITY=/run/user/1000/gdm/Xauthority XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/etc/xdg PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin GJS_DEBUG_TOPICS=JS ERROR;JS LOG [...]
Die Ausgabe des Befehls liefert eine Menge Zeilen - wesentlich mehr als das, was im obigen Auszug enthalten ist. Aber beachten Sie vorerst den PATH
-Eintrag, der jene Verzeichnisse enthält, in denen eine Shell (und andere Programme) nach ausführbaren Programmen sucht, ohne dafür einen vollständigen Dateipfad angeben zu müssen. Mit diesen Variablen könnten Sie binäre Programme, welche z.B. in /usr/local/bin
abgelegt sind, von Ihrem Homeverzeichnis aus starten.
Lassen Sie uns für einen Moment das Thema wechseln. Der Befehl echo
liefert Bildschirmausgaben, entsprechend der übergebenen Werte. Ob Sie es glauben oder nicht, es wird mehrfach sehr zweckdienlich sein, echo
buchstäblich etwas wiederholen zu lassen.
$ echo "Hi. How are you?" Hi. How are you?
Aber echo
erfüllt noch einen weiteren Zweck. Wenn es mit dem Namen einer Umgebungsvariablen gefüttern wird — und diesem sagen, dass es sich dabei um eine Variable handelt, indem Sie dem Variablennamen ein $
voranstellen — dann wird die Shell den Wert der Variable ausgeben, anstatt nur den Namen der Variable auszugeben. Sie sind sich nicht sicher, ob ein bestimmtes Verzeichnis aktuell Bestandteil von PATH
ist? Dies lässt sich schnell überprüfen, indem man den Variablenwert einfach mittels echo
ausgeben lässt:
$ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
Neue Umgebungsvariablen erstellen
Sie können Ihre eigenen benutzerdefinierten Variablen zu Ihrer Umgebung hinzufügen. Der einfachste Weg ist die Verwendung des =
Zeichens. Die Zeichenfolge auf der linken Seite stellt den Name Ihrer neuen Variablen dar, und die Zeichenfolge auf der rechten Seite wird Ihr Wert. Sie können anschließend den Variablennamen an echo
übergeben, um die Variablenzuweisung zu bestätigen:
$ myvar=hello $ echo $myvar hello
Note
|
Beachten Sie, dass während der Variablenzuweisung auf beiden Seiten des Gleichheitszeichens kein Leerzeichen vorhanden sein darf. |
Aber hat es wirklich funktioniert? Geben Sie bash
in ein Terminal ein, um eine neue Shell zu öffnen. Diese neue Shell sieht genau so aus wie jene zuvor, aber sie ist eigentlich ein Kind der ursprünglichen Shell (welche wir als Elternteil bezeichnen). Versuchen Sie nun, innerhalb dieser neuen Kindshell, echo
dazu zu bringen, seine Magie wie zuvor wirken zu lassen. Nichts. Was geht hier vor?
$ bash $ echo $myvar $
Eine Variable, welche Sie auf die Weise erstellen, wie wir es gerade getan haben, ist stets nur lokal verfügbar — innerhalb der unmittelbaren Shellsitzung. Wenn Sie eine neue Shell starten — oder die Sitzung mit exit
beenden — wird die Variable nicht exportiert. Wenn Sie nun exit
eingeben, kehren Sie zum ursprünglichen Elternteil (Shell) zurück. Sie können echo $myvar
noch einmal ausführen, um zu bestätigen, dass die Variable immer noch gültig ist. Geben Sie nun export myvar
ein, um die Variable an alle Kindshells zu übergeben, die Sie anschließend öffnen. Probieren Sie es aus: Tippen Sie bash
für eine neue Shell und dann echo
:
$ exit $ export myvar $ bash $ echo $myvar hello
All dies mag sich ein bisschen albern anfühlen, wenn Sie Shells ohne wirklichen Zweck erzeugen. Zu verstehen, wie Shellvariablen durch Ihr System hindurchgereicht werden, ist essentiell, beispielsweise bei der Erstellung von Shellskripten.
Löschen von Umgebungsvariablen
Wollen Sie wissen, wie Sie all die temporären Variablen, welche Sie erzeugt haben, bereinigen können? Eine Möglichkeit besteht darin, einfach Ihre Elternshell zu schließen - oder Ihren Computer neu zu starten. Es gibt aber auch einfachere Wege. Wie zum Beispiel den Befehl unset
. Die Eingabe von unset
(ohne $
) wird die Variable löschen. echo
wird das beweisen.
$ unset myvar $ echo $myvar $
Wenn es einen unset
Befehl gibt, dann können Sie darauf wetten, dass es dazu einen set
Befehl geben muss. Die Ausführung von set
an sich liefert eine umfangreiche Ausgabe, aber es unterscheidet sich wirklich nicht allzu sehr von dem, was env
anzeigt. Schauen Sie sich die erste Zeile der Ausgabe an, die Sie erhalten, wenn Sie nach PATH
filtern:
$ set | grep PATH PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin [...]
Was ist der Unterschied zwischen set
und env
? Für unsere Zwecke ist die Hauptsache, dass set
alle Variablen und Funktionen ausgibt. Lassen Sie uns das veranschaulichen. Wir werden eine neue Variable namens mynewvar
erstellen und dann deren Existenz bestätigen:
$ mynewvar=goodbye $ echo $mynewvar goodbye
Wenn Sie nun env
ausführen, während Sie mit grep
nach der Zeichenkette mynewvar
filtern, wird keine Ausgabe erscheinen. Aber wenn Sie set
auf die gleiche Weise ausführen, wird die lokale Variable angezeigt.
$ env | grep mynewvar $ set | grep mynewvar mynewvar=goodbye
Sonderzeichen entkommen
Jetzt ist ein guter Zeitpunkt Sie in die Problematik der Sonderzeichen einzuführen. Alphanumerische Zeichen (a-z und 0-9) werden von Bash normalerweise buchstäblich gelesen. Wenn Sie versuchen, eine neue Datei namens myfile
zu erstellen, geben Sie einfach touch
gefolgt von myfile
ein, und die Bash wird wissen, was sie damit machen soll. Aber wenn Sie ein Sonderzeichen in Dateinamen verwenden, erfordert dies zusätzliche Arbeit.
Um dies zu veranschaulichen, geben wir touch
gefolgt von my big file
ein. Das Problem ist, dass sich zwischen den Wörtern zwei Leerzeichen befinden. Obwohl man ein Leerzeichen technisch gesehen nicht als “Zeichen” bewerten würde, ist es ein “Zeichen”, welches Bash nicht buchstäblich interpretieren wird. Wenn Sie nun den Inhalt Ihres aktuellen Verzeichnisses auflisten, werden Sie statt einer Datei namens my big file
, drei Dateien mit den jeweiligen Namen my
, big
und file
vorfinden. Das liegt daran, dass Bash die Leerzeichen als Trenner interpretiert hat. Ganz so als wollten Sie mehrere Dateien erstellen, deren Namen in einer Liste übergeben wurden:
$ touch my big file $ ls my big file
Die Leerzeichen werden auf die gleiche Weise interpretiert, wenn Sie die drei Dateien mit einem einzigen Befehl löschen (rm
):
$ rm my big file
Lassen Sie es uns nun auf die richtige Art und Weise versuchen. Geben Sie touch
und die drei Teile Ihres Dateinamens ein, aber diesmal schließen Sie den Namen in Anführungszeichen ein. Jetzt hat es funktioniert. Wenn Sie den Verzeichnisinhalt auflisten, sehen Sie eine einzelne Datei mit dem richtigen Namen.
$ touch "my big file" $ ls 'my big file'
Es gibt verschiedene Wege, den gleichen Effekt zu erzielen. Einfache Anführungszeichen zum Beispiel funktionieren genauso gut wie doppelte Anführungszeichen. (Beachten Sie, dass einfache Anführungszeichen den wörtlichen Wert aller Zeichen erhalten, während doppelte Anführungszeichen alle Zeichen ausgenommen für $
, `
, \
und, in bestimmten Fällen, !
erhalten).
$ rm 'my big file'
Wenn aber jedem Sonderzeichen den Backslash voranstellt, “entkommt” man der Besonderheit des Zeichens und veranlasst Bash, es buchstäblich zu interpretieren.
$ touch my\ big\ file
Geführte Übungen
-
Verwenden Sie den Befehl
export
, um ein neues Verzeichnis zu Ihrem Pfad hinzuzufügen (dies wird einen Neustart nicht überdauern). -
Verwenden Sie den Befehl
unset
, um die VariablePATH
zu löschen. Versuchen Sie, einen Befehl (wiesudo cat /etc/shadow
) mitsudo
auszuführen. Was ist passiert? Warum? (Wenn Sie Ihre Shell beenden, kehren Sie in den ursprünglichen Zustand zurück.)
Offene Übungen
-
Durchsuchen Sie das Internet, um die vollständige Liste der Sonderzeichen zu finden und zu untersuchen.
-
Versuchen Sie, Befehle mit Zeichenketten auszuführen, welche Sonderzeichen enthalten, und verwenden Sie verschiedene Methoden, um diesen zu entkommen. Gibt es Unterschiede in der Art und Weise, wie sich diese Methoden verhalten?
Zusammenfassung
In dieser Lektion haben Sie gelernt:
-
Wie man Umgebungsvariablen im System identifiziert.
-
Wie man eigene Umgebungsvariablen erstellt und diese in andere Shells exportiert.
-
Wie man Umgebungsvariablen entfernt und wie man sowohl die Befehle
env
als auchset
verwendet. -
Wie man Sonderzeichen umgeht, damit Bash sie buchstäblich interpretiert.
Die folgenden Befehle wurden in dieser Lektion besprochen:
echo
-
Ausgabe von Eingabestrings und Variablen.
env
-
Umgebungsvariablen verstehen und modifizieren.
export
-
Exportieren von Umgebungsvariablen an Kindshells.
unset
-
Zurücksetzen von Werten und Attributen von Shellvariablen und Funktionen.
Lösungen zu den geführten Übungen
-
Verwenden Sie den Befehl
export
, um ein neues Verzeichnis zu Ihrem Pfad hinzuzufügen (dies wird einen Neustart nicht überdauern).Sie können vorübergehend ein neues Verzeichnis (beispielsweise eines namens
myfiles
, das sich in Ihrem Homeverzeichnis befindet) zu den aktuellen Pfaden hinzufügen, indem Sieexport PATH="/home/yourname/myfiles:$PATH"
ausführen. Erstellen Sie anschließend ein simples Skript im Verzeichnismyfiles/
, machen Sie es ausführbar und versuchen Sie, es von einem anderen Verzeichnis aus zu starten. Die folgenden Beispielbefehle gehen davon aus, dass Sie sich in Ihrem Homeverzeichnis befinden, welches ein Verzeichnis namensmyfiles
enthält.$ touch myfiles/myscript.sh $ echo '#!/bin/bash' >> myfiles/myscript.sh $ echo 'echo Hello' >> myfiles/myscript.sh $ chmod +x myfiles/myscript.sh $ myscript.sh Hello
-
Verwenden Sie den Befehl
unset
, um die VariablePATH
zu löschen. Versuchen Sie, einen Befehl (wiesudo cat /etc/shadow
) mitsudo
auszuführen. Was ist passiert? Warum? (Wenn Sie Ihre Shell beenden, kehren Sie in den ursprünglichen Zustand zurück.)Die Eingabe von
unset PATH
löscht die aktuellen Pfadeinstellungen. Der Versuch, eine Binärdatei ohne ihre absolute Adresse aufzurufen, wird fehlschlagen. Aus diesem Grund wird der Versuch, einen Befehl unter Verwendung vonsudo
(das selbst ein binäres Programm ist, welches sich in/usr/bin/sudo
befindet) auszuführen, fehlschlagen - es sei denn, Sie geben den absoluten Pfad an, wie in:/usr/bin/sudo /bin/cat /etc/shadow
. Sie könnenPATH
zurücksetzen, indem Sieexport
benutzen oder indem Sie einfach die Shell beenden.
Lösungen zu den offenen Übungen
-
Durchsuchen Sie das Internet, um die vollständige Liste der Sonderzeichen zu finden und zu untersuchen.
Folgend die komplette Liste:
& ; | * ? " ' [ ] ( ) $ < > { } # / \ ! ~
. -
Versuchen Sie, Befehle mit Zeichenketten auszuführen, welche Sonderzeichen enthalten, und verwenden Sie verschiedene Methoden, um diesen zu entkommen. Gibt es Unterschiede in der Art und Weise, wie sich diese Methoden verhalten?
Bei der Verwendung des
"
-Zeichen bleibt die Interpretation der Sonderzeichen Dollarzeichen, Backtick und Backslash erhalten. Das Entkommen unter Verwendung eines'
-Zeichens hingegen veranlasst die buchstäbliche Interpretation aller Zeichen.$ echo "$mynewvar" goodbye $ echo '$mynewvar' $mynewvar