Beschreibung: Prüfungskandidaten sollten in der Lage sein, mit Shell und Kommandos auf der Kommandozeile umzugehen. Das beinhaltet das Schreiben gültiger Kommandos und Kommandoabfolgen, das Definieren, Referenzieren und Exportieren von Umgebungsvariablen, die Benutzung der Kommando-History und Eingabemöglichkeiten, das Aufrufen von Kommandos im und außerhalb des Suchpfades, das Benutzen von Kommandosubstitution, das rekursive Anwenden von Kommandos über einen Verzeichnisbaum und das Verwenden von man, um Informationen über Kommandos zu erhalten.
Die wichtigsten Dateien, Bezeichnungen und Anwendungen:
Grundsätzlich ist ein Unix-Kommando immer gleich aufgebaut. Zuerst wird das Programm angegeben, dann optionale Parameter und dann die Dateien, auf die das Programm angewandt werden soll.
Parameter liegen meist in zwei verschiedenen Formen vor, einmal als kurze Form, eingeleitet durch einen Bindestrich gefolgt von einem Buchstaben (wie etwa -r) und andererseits als lange Form, eingeleitet durch zwei Bindestriche gefolgt von einem Wort (--recursive). Kurze Parameter können dabei meist zusammengefasst werden, so daß statt -z -v -f einfach -zvf geschrieben werden kann. Das erklärt auch, warum lange Parameter mit zwei Bindestrichen beginnen. Sonst könnte ja ein --recursive als -r -e -c -u -r -s -i -v -e missinterpretiert werden.
Linux-Kommandos werden entweder einfach eingegeben, oder zusammen mit dem Pfad, der die genaue Position des aufzurufenden Programmes im Dateisystem festlegt. Normalerweise reicht der Aufruf eines Kommandos ohne Pfad, wenn das Kommando im Suchpfad liegt.
Der Suchpfad wird in einer Shellvariable PATH definiert, die in der Regel in den Konfigurationsdateien der Shell mit vernünftigen Werten belegt wird. Diese Variable enthält eine durch Doppelpunkte getrennte Liste von Verzeichnissen, die von der Shell nach einem Befehl durchsucht werden sollen. Das aktuelle Verzeichnis ist nicht automatisch Teil des Suchpfades (wie bei DOS/Windows) sondern wird nur durchsucht, wenn es explizit durch die Angabe eines einzelnen Punktes im Suchpfad angegeben wurde.
Welches Verzeichnis gerade das aktuelle Arbeitsverzeichnis ist, kann mit dem Befehl pwd herausgefunden werden. Dieser Befehl gibt den kompletten absoluten Pfad des aktuellen Arbeitsverzeichnisses auf der Standard-Ausgabe aus.
Die Shell durchsucht den Suchpfad in der angegebenen Reihenfolge. Existieren auf einem System jetzt zwei Programme gleichen Namens, so wird das Programm ausgeführt, das sich in dem zuerst im Suchpfad genannten Verzeichnis befindet. Dieser Mechanismus kann umgangen werden, wenn nicht nur der Programmname, sondern der komplette Pfad als Befehl eingegeben wird. Auch Programme, die sich in Verzeichnissen befinden, die nicht im Suchpfad sind, können auf diese Weise aufgerufen werden.
Die Eingabe gültiger Kommandos und Kommandogruppen beinhaltet natürlich auch das Wissen um die verschiedenen Möglichkeiten, mehrere Befehle in eine Befehlszeile zu schreiben. Zur Erinnerung sind hier nochmal die verschiedenen Möglichkeiten der bash aufgelistet:
Vor der eigentlichen Ausführung des Kommandos wird der gesamte eingegebene Befehl in einen Kommandospeicher abgespeichert, aus dem er jederzeit (durch Navigieren mit den Pfeiltasten nach oben und unten) wiedergeholt und erneut ausgeführt werden kann. Wird die Shell beendet (etwa durch das Ausloggen), so werden alle im Kommandospeicher gespeicherten Befehle in die Datei ~/.bash_history im Heimatverzeichnis des jeweiligen Users abgelegt, so daß die Befehle auch beim erneuten Einloggen wieder zur Verfügung stehen.
Ein eingegebenes Kommando erzeugt in der Regel einen neuen Prozeß. Wenn der Prozeß abgeschlossen wurde kehrt die Shell wieder zur Eingabeaufforderung zurück. Ein spezieller Befehl erlaubt es aber, einen Befehl einzugeben, der die Shell ersetzt. Der Befehl exec Kommando ersetzt den Shellprozeß durch den Prozeß des eingegebenen Kommandos. Das macht Sinn, wenn eine andere Shell aufgerufen werden soll oder der Befehl innerhalb eines Scripts ausgeführt wird. Wird ein durch exec ausgeführter Befehl beendet, ist aber logischerweise die Shell nicht mehr da, der Shellprozeß wurde ja durch das Kommando ersetzt.
Umgebungsvariablen werden in einer Shell definiert, indem sie einfach mit der Anweisung
Variablenname=Wert
angelegt werden. Existierte die Variable mit dem entsprechenden Namen noch nicht, so wird sie neu angelegt, gab es sie schon, so wird ihr Wert verändert.
Um auf den Inhalt (Wert) einer Variable zuzugreifen (refernzieren der Variable), wird dem Variablennamen ein Dollarzeichen ($) vorangestellt. Wenn die Shell auf ein Dollarzeichen stößt, versucht sie, den darauf folgenden Begriff als Variablennamen zu interpretieren und das ganze Konstrukt mit dem Wert der entsprechenden Variable zu ersetzen.
NAME=Huber VORNAME=Hans echo Hallo $VORNAME $NAME Hallo Hans HuberAlle definierten Variablen sind mit dem Befehl set anzeigbar, mit unset können Variablen aus dem Umgebungsspeicher entfernt werden:
unset NAME unset VORNAME
Wenn aus einer Shell heraus eine neue Shell (Subshell) aufgerufen wird, dann werden nicht automatisch alle Variablen der aufrufenden Shell für die Subshell übernommen. Um eine bestimmte Variable an spätere Subshells weiterzugeben, muß diese Variable exportiert werden. Das geschieht mit der Shell-Anweisung export. Dabei kann entweder eine bestehende Variable exportiert werden wie mit
export Variablenname
oder eine Variable gleich so definiert werden, daß sie später exportiert wird mit
export Variablenname=Wert
Eine exportierte Variable ist eine Kopie der Orginalvariablen. Das heißt, daß die Orginalvariable der aufrufenden Shell unverändert bleibt, wenn die exportierte Variable der Subshell verändert wird!
Variablen, die immer wieder benötigt werden, können in der Datei ~/.profile im Homeverzeichnis jedes Users definiert werden. Diese Datei wird bei jedem Start einer Login-Shell abgearbeitet. So stehen einmal dort definierte Variablen jederzeit wieder zur Verfügung.
Soll ein Kommando mit bestimmten Variablen zusammen aufgerufen werden (also in einer bestimmten Umgebung), dann kann das mit dem Befehl env erledigt werden. Dabei kann entweder das Programm in einer völlig leeren Umgebung gestartet werden, oder zusätzliche Variablen werden speziell für diesen Programmaufruf definiert.
Es gibt zwei Möglichkeiten, die Kommandosubstitution einzuschalten. Zum einen die Klammerung mit dem Grave-Zeichen (`) und zum anderen das Konstrukt $(...)
Das klingt schlimmer als es ist, ein einfaches Beispiel soll zeigen, worum es geht:
Der Befehl pwd gibt an, in welchem Verzeichnis wir uns gerade befinden (Print WorkingDirectory). Wir werden ihn jetzt in einer Kommandosubstitution benutzen. Das Kommando
echo Wir befinden uns im Verzeichnis $(pwd)wird eingegeben. Statt dessen wäre auch
echo Wir befinden uns im Verzeichnis `pwd`gegangen. Was passiert nun mit dieser Befehlszeile? Die Shell ließt diese Zeile und stößt auf das Konstrukt $(pwd). Sie erkennt dieses Konstrukt als Aufruf einer Kommandosubstitution und startet jetzt eine Subshell. Diese Subshell führt den Befehl pwd aus. Dieser Befehl schreibt das aktuelle Arbeitsverzeichnis auf die Standard-Ausgabe. Nehmen wir mal an, wir befänden uns im Verzeichnis /home/hans. Die Ausgabe des Befehls wäre also /home/hans. Jetzt ersetzt die ursprüngliche Shell das Konstrukt $(pwd) mit der Ausgabe der Subshell, also mit /home/hans. Die dadurch entstehende Kommandozeile lautet jetzt also
echo Wir befinden uns im Verzeichnis /home/hansUnd erst jetzt führt die Shell dieses Kommando aus.
Befehl | Kurze Form | Lange Form |
---|---|---|
ls | -R | --recursive |
chown | -R | --recursive |
chmod | -R | --recursive |
chgrp | -R | --recursive |
grep | -r | --recursive |
cp | -r und -R | --recursive |
rm | -r und -R | --recursive |
In der Vorbereitung auf die LPI102 Prüfung wird dieses Handbuchsystem noch genauer erläutert. Für den einfachen Umgang damit reichen die folgenden Informationen:
Das Programm man bietet Zugriff auf die Handbuchseiten (manual-pages). Es erwartet mindestens den Namen des Programmes als Parameter, über das Informationen dargestellt werden sollen. Um also Informationen über den Befehl cp (copy) zu erhalten, genügt der Befehl
man cpDas Programm man stellt jetzt eine Handbuchseite zum Thema cp zusammen und gibt sie über den systemeigenen Pager (meist das Programm less auf dem Bildschirm aus.