Kapitel 27. Arbeiten mit der Shell

Inhaltsverzeichnis

27.1. Verwenden von Bash in der Befehlszeile
27.2. Benutzer und Zugriffsberechtigungen
27.3. Wichtige Linux-Befehle
27.4. Der vi-Editor

Zusammenfassung

Unter Linux werden grafische Benutzeroberflächen immer wichtiger. Die Maus ist für die täglichen Aufgaben jedoch nicht immer am besten geeignet. Die Befehlszeile bietet hohe Flexibilität und Effizienz. Textbasierte Anwendungen spielen eine besonders große Rolle beim Steuern von Computern über langsame Netzwerkverbindungen oder bei der Ausführung von Aufgaben als root an der Befehlszeile in einem xterm. Die Bash-Shell ist der standardmäßige Befehlszeilen-Interpreter unter SUSE Linux.

Linux ist ein Mehrbenutzersystem und der Zugriff auf Dateien wird durch Benutzerberechtigungen gesteuert. Ein Verständnis des Berechtigungsprinzips ist immer hilfreich, unabhängig davon, ob Sie eine Befehlszeile oder eine grafische Benutzeroberfläche verwenden. Wenn Sie mit der Befehlszeile arbeiten, spielen mehrere Befehle eine wichtige Rolle. Der Texteditor vi wird häufig zum Konfigurieren eines Systems über die Befehlszeile verwendet. Er ist auch bei vielen Systemadministratoren und Entwicklern beliebt.

27.1. Verwenden von Bash in der Befehlszeile

In der KDE-Kontrollleiste befindet sich ein Symbol, das einen Monitor mit einer Muschel darstellt. Wenn Sie auf dieses Symbol klicken, wird ein Terminalfenster geöffnet, in das Sie Befehle eingeben können. Die Konsole führt in der Regel Bash aus (Bourne again Shell), ein Programm, das ein Teil des GNU-Projekts ist. Klicken Sie auf dem GNOME-Desktop auf ein Symbol mit einem Computermonitor im oberen Feld, um ein Terminal zu starten, das in der Regel Bash ausführt.

Sobald Sie die Shell geöffnet haben, sehen Sie die Eingabeaufforderung (engl. prompt) in der ersten Zeile. In der Regel besteht diese aus dem Benutzernamen, dem Host-Namen und dem aktuellen Pfad — dies kann jedoch angepasst werden. Wenn sich der Cursor rechts von dieser Eingabeaufforderung befindet, können Sie Befehle direkt an das Computersystem senden.

27.1.1. Eingeben von Befehlen

Ein Befehl besteht aus mehreren Elementen. Das erste Element ist stets der eigentliche Befehl, gefolgt von Parametern oder Optionen. Befehle werden ausgeführt, wenn Sie die Eingabetaste drücken. Zuvor können Sie die Befehlszeile ganz einfach bearbeiten, Optionen hinzufügen oder Tippfehler korrigieren. Einer der am häufigsten verwendeten Befehle ist ls, der mit oder ohne Argumente verwendet werden kann. Durch Eingabe des Befehls ls ohne Zusatz wird der Inhalt des aktuellen Verzeichnisses angezeigt.

Optionen wird als Präfix ein Bindestrich vorangestellt. Der Befehl ls -l z. B. zeigt den Inhalt desselben Verzeichnisses mit allen Details an (im langen Listenformat). Neben jedem Dateinamen wird das Erstellungsdatum der Datei angezeigt, die Dateigröße in Byte und weitere Details, die später besprochen werden. Eine wichtige Option, die für viele Befehle existiert, ist --help. Durch Eingabe von ls --help werden alle Optionen für den Befehl ls angezeigt.

Die richtige „Schreibweise“ ist wichtig. Wenn ein Dateiname ein Leerzeichen enthält, fügen Sie entweder ein Escape-Zeichen in Form eines umgekehrten Schrägstrichs ein (\) oder schließen Sie den Dateinamen in einfachen oder doppelten Anführungszeichen ein. Anderenfalls interpretiert Bash einen Dateinamen wie Eigene Dokumente als den Namen von zwei Dateien oder Verzeichnissen. Der Unterschied zwischen einfachen und doppelten Anführungszeichen ist, dass bei doppelten Anführungszeichen eine Variablenerweiterung stattfindet. Einfache Anführungszeichen gewährleisten, dass die Zeichenfolge von der Shell buchstäblich interpretiert wird.

27.1.2. Dateien und Verzeichnisse

Um die Shell effizient zu nutzen, sind einige Kenntnisse der Datei- und Verzeichnisstruktur eines Linux-Systems hilfreich. Verzeichnisse sind elektronische Ordner, in denen Dateien, Programme und Unterverzeichnisse gespeichert sind. Das Verzeichnis der obersten Ebene in der Hierarchie ist das Root-Verzeichnis, auch / genannt. Von hier aus kann auf alle anderen Verzeichnisse zugegriffen werden.

Das Verzeichnis /home enthält die Verzeichnisse, in denen die einzelnen Benutzer ihre persönlichen Dateien speichern können. Abbildung 27.1, „Auszug aus einer Standardverzeichnisstruktur“ zeigt die standardmäßige Verzeichnisstruktur unter Linux an mit den Home-Verzeichnissen der Beispielbenutzer xyz, linux und tux. Die Verzeichnisstruktur eines Linux-Systems hat eine funktionelle Struktur, die dem Filesystem Hierarchy Standard (Dateisystem-Hierarchiestandard, FHS) entspricht. Die folgende Liste enthält eine kurze Beschreibung der Standardverzeichnisse unter Linux.

Abbildung 27.1. Auszug aus einer Standardverzeichnisstruktur

Auszug aus einer Standardverzeichnisstruktur
/

Root-Verzeichnis, Startpunkt der Verzeichnisstruktur

/home

Persönliche Verzeichnisse von Benutzern

/dev

Gerätedateien, die Hardware-Komponenten darstellen

/etc

Wichtige Dateien für die Systemkonfiguration

/etc/init.d

Startskripts

/usr/bin

Programme, die für den allgemeinen Zugriff verfügbar sind.

/bin

Programme, die am Anfang des Startvorgangs benötigt werden.

/usr/sbin

Programme, die für den Systemadministrator reserviert sind.

/sbin

Programme, die für den Systemadministrator reserviert und für den Start erforderlich sind.

/usr/include

Header-Dateien für den C-Compiler

/usr/include/g++

Header-Dateien für den C++-Compiler

/usr/share/doc

Verschiedene Dokumentationsdateien

/usr/share/man

Systemhandbuchseiten (Manualpages)

/usr/src

Quellcode der Systemsoftware

/usr/src/linux

Kernel-Quellcode

/tmp, /var/tmp

Temporäre Dateien

/usr

Alle Anwendungsprogramme

/var

Konfigurationsdateien (wie solche, die über /usr verknüpft sind)

/var/log

Systemprotokolldateien

/var/adm

Systemverwaltungsdaten

/lib

Freigegebene Bibliotheken (für dynamisch verknüpfte Programme)

/proc

Prozessdateisystem

/sys

Systemdateisystem, in dem alle Gerätedaten für den Kernel gesammelt werden.

/usr/local

Lokale, verteilungsunabhängige Erweiterungen

/opt

Optionale Software, größere Add-On-Programmpakete (wie KDE, GNOME, Netscape)

27.1.3. Bash-Funktionen

Es gibt zwei wichtige Funktionen der Shell, die Ihnen die Arbeit erheblich erleichtern können:

Chronik

Um einen Befehl zu wiederholen, der bereits eingegeben wurde, drücken Sie , bis der vorherige Befehl an der Befehlseingabe angezeigt wird. Sie können sich durch eine Liste von zuvor eingegebenen Befehlen bewegen, indem Sie  drücken. Um die Befehlszeile zu bearbeiten, verschieben Sie den Cursor an die gewünschte Position mit den Pfeiltasten und beginnen die Eingabe. Verwenden Sie Strg-R, um die Chronik zu durchsuchen.

Ergänzung

Ergänzt einen Dateinamen zu seiner vollen Länge, nachdem die ersten Buchstaben eingegeben werden, sobald er eindeutig erkannt wird. Geben Sie hierzu die ersten Buchstaben ein und drücken Sie die Tab-Taste. Wenn es mehrere Dateinamen gibt, die mit denselben Buchstaben beginnen, können Sie eine Liste anzeigen, indem Sie die Tab-Taste zweimal drücken.

27.1.3.1. Erstes Beispiel: Verwalten von Dateien

Da Sie nun wissen, wie ein Befehl aussieht, welche Verzeichnisse in SUSE Linux vorhanden sind und wie Sie mit Bash die Vorgänge beschleunigen können, können Sie Ihr Wissen mit einer kleinen Übung in die Praxis umsetzen.

  1. Öffnen Sie eine Konsole auf dem KDE- oder GNOME-Desktop, indem Sie auf das Muschel-Symbol klicken.

  2. Geben Sie den Befehl ls ein, um den Inhalt Ihres Home-Verzeichnisses anzuzeigen.

  3. Verwenden Sie den Befehl mkdir (der für make directory (Verzeichnis erstellen) steht), um ein neues Unterverzeichnis mit dem Namen test zu erstellen, indem Sie mkdir test eingeben.

  4. Starten Sie nun einen Editor, indem Sie die Alt-Taste-F2 drücken und kate für Kate in KDE und gedit für Gedit in GNOME eingeben. Geben Sie ein paar Buchstaben in den Editor ein und speichern Sie die Datei unter dem Namen Testdatei im Home-Verzeichnis. Linux unterscheidet zwischen Groß- und Kleinschreibung. Verwenden Sie in diesem Beispiel ein groß geschriebenes T.

  5. Zeigen Sie den Inhalt Ihres Home-Verzeichnisses erneut an. Anstatt ls erneut einzugeben, drücken Sie einfach  zweimal und der Befehl ls sollte erneut an der Eingabeaufforderung angezeigt werden. Drücken Sie die Eingabetaste, um den Befehl auszuführen. Das neu erzeugte Verzeichnis test sollte in blauen Buchstaben und Testdatei sollte in schwarzen Buchstaben angezeigt werden. So können Verzeichnisse und Dateien in einer Konsole unterschieden werden.

  6. Verschieben Sie Testdatei in das Unterverzeichnis test mit dem Befehl mv. Um diesen Vorgang zu beschleunigen, verwenden Sie die Erweiterungsfunktion: geben Sie einfach mv T ein und drücken Sie die Tab-Taste. Solange keine andere Datei im Verzeichnis mit diesem Buchstaben beginnt, erweitert die Shell den Dateinamen und fügt die Zeichenfolge estdatei hinzu. Fügen Sie anderenfalls selbst einen Buchstaben oder zwei hinzu und testen Sie durch Drücken der Tab-Taste bei jeder Eingabe, ob die Shell den Namen nun erweitern kann. Geben Sie dann ein Leerzeichen und test nach dem erweiterten Dateinamen ein und drücken Sie die Eingabetaste, um den Befehl auszuführen.

  7. Testdatei sollte sich zu diesem Zeitpunkt nicht mehr im Verzeichnis befinden. Prüfen Sie dies, indem Sie ls erneut eingeben.

  8. Um zu überprüfen, ob die Datei erfolgreich verschoben wurde, wechseln Sie in das Verzeichnis test mit dem Befehl cd test. Geben Sie ls erneut ein. Testdatei sollte nun in der Liste aufgeführt sein. Wechseln Sie zurück in das Home-Verzeichnis an einen beliebigen Punkt, indem Sie lediglich cd eingeben.

  9. Um eine Kopie der Datei zu erstellen, verwenden Sie cp. Geben Sie z. B. cp Testdatei Testbackup ein, um Testdatei in Testbackup zu kopieren. Der Befehl ls kann verwendet werden, um zu sehen, ob sich beide Dateien im Verzeichnis befinden.

27.1.4. Festlegen von Pfaden

Beim Arbeiten mit Dateien oder Verzeichnissen ist es wichtig, den richtigen Pfad anzugeben. Sie müssen jedoch nicht den gesamten (absoluten) Pfad aus dem Root-Verzeichnis zur jeweiligen Datei angeben. Sie können im aktuellen Verzeichnis starten. Adressieren Sie das Home-Verzeichnis direkt mit ~. Dies bedeutet, dass es zwei Methoden gibt, um die Datei Testdatei im Verzeichnis test aufzuführen: Sie können den relativen Pfad mit ls test eingeben oder den absoluten Pfad mit ls ~/test festlegen.

Um die Inhalte von Home-Verzeichnissen anderer Benutzer aufzulisten, geben Sie ls ~Benutzername ein. In der Beispielverzeichnisstruktur ist einer der Beispielsbenutzer tux. In diesem Fall würde ls ~tux den Inhalt des Home-Verzeichnisses von tux auflisten.

Das aktuelle Verzeichnis wird mit einem Punkt (.) angegeben. Die nächsthöhere Ebene in der Struktur wird durch zwei Punkte dargestellt (..). Indem Sie ls .. eingeben, wird der Inhalt des übergeordneten Verzeichnisses des aktuellen Verzeichnisses angezeigt. Der Befehl ls ../.. zeigt den Inhalt des Verzeichnisses an, das in der Hierarchie zwei Ebenen höher liegt.

27.1.4.1. Zweites Beispiel: Arbeiten mit Pfaden

Hier finden Sie ein weiteres Beispiel, wie Sie sich in den Verzeichnissen des SUSE Linux-Systems bewegen.

  1. Wechseln Sie in das Home-Verzeichnis mit dem Befehl cd. Erstellen Sie dann darin ein Unterverzeichnis mit dem Namen test2, indem Sie mkdir test2 eingeben.

  2. Wechseln Sie in das neue Verzeichnis mit cd test2 und erstellen Sie darin ein Unterverzeichnis mit dem Namen Unterverzeichnis. Um in das Verzeichnis zu wechseln öffnen, verwenden Sie die Erweiterungsfunktion: Geben Sie cd Un ein und drücken Sie die Tab-Taste. Die Shell erweitert den Rest des Verzeichnisnamens.

  3. Versuchen Sie nun, die zuvor erzeugte Datei Testbackup zurück in das aktuelle Verzeichnis (Unterverzeichnis) zu verschieben, ohne das Verzeichnis erneut zu wechseln. Legen Sie hierzu den relativen Pfad zu dieser Datei fest: mv ../../test/Testbackup . (Beachten Sie den Punkt am Ende). Der Punkt am Ende des Befehls ist erforderlich, damit die Shell erkennt, dass das aktuelle Verzeichnis das Ziel ist, in das die Datei verschoben werden soll. ../../ bezieht sich in diesem Beispiel auf das Home-Verzeichnis.

27.1.5. Platzhalter

Ein weiterer Pluspunkt der Shell sind Platzhalter für die Pfadnamenserweiterung. In Bash gibt es davon drei verschiedene Typen:

?

Entspricht genau einem zufälligen Zeichen

*

Entspricht einer beliebigen Anzahl an Zeichen

[set]

Entspricht einem der Zeichen aus der Gruppe, die in den eckigen Klammern angegeben wurden, die hier durch die Zeichenfolge set dargestellt werden. Als Teil von set können Sie auch Zeichenklassen mit der Syntax [:class:] festlegen, wobei class zu alnum, alpha, ascii usw. gehört.

Wenn Sie ! oder ^ am Beginn der Gruppe verwenden ([!set]) wird eine Übereinstimmung mit einem Zeichen gesucht, das keinem der Zeichen entspricht, die durch set festgelegt wurden.

Angenommen, das Verzeichnis test enthält die Dateien Testdatei, Testdatei1, Testdatei2 und Datendatei, dann führt der Befehl ls Testdatei? die Dateien Testdatei1 und Testdatei2 auf. Mit ls Test* enthält die Liste auch Testdatei. ls *dat* zeigt alle Beispieldateien an. Schließlich können Sie den Platzhalter set verwenden, um alle Beispieldateien zu adressieren, deren letztes Zeichen eine Ziffer ist: ls Testdatei[1-9] oder, wenn Sie Klassen verwenden, ls Testdatei[[:digit:]].

Von den vier Platzhaltertypen beinhaltet das Sternchen die meisten Zeichen. Es kann verwendet werden, um alle im Verzeichnis enthaltenen Dateien in ein anderes zu kopieren oder um alle Dateien mit einem Befehl zu löschen. Der Befehl rm *dat* würde z. B. alle Dateien im aktuellen Verzeichnis löschen, deren Namen die Zeichenfolge dat umfassen.

27.1.6. Less und More

Linux umfasst zwei kleine Programme zum Anzeigen von Textanzeigen direkt in der Shell. Anstatt einen Editor zu starten, um eine Datei zu lesen wie Readme.txt, geben Sie einfach less Readme.txt ein, um den Text im Konsolenfenster anzuzeigen. Verwenden Sie die Leertaste, um die Seiten durchzublättern. Verwenden Sie Pfeil-Aufwärts und Pfeil-Abwärts, um sich im Text nach vorne oder hinten zu bewegen. Um less zu beenden, drücken Sie Q.

Statt less können Sie auch das ältere Programm "more" verwenden. Dies ist jedoch weniger praktisch, da Sie nicht zurückscrollen können.

Das Programm less hat seinen Namen von dem Konzept less is more (weniger ist mehr) und kann auch verwendet werden, um die Ausgabe von Befehlen auf bequem mitzuverfolgen. Wie dies funktioniert, wird in Abschnitt 27.1.7, „Pipe und Umleitung“ beschrieben.

27.1.7. Pipe und Umleitung

In der Regel wird in der Shell als Standardausgabe der Bildschirm oder das Konsolenfenster verwendet, während die Standardeingabe über die Tastatur erfolgt. Um die Ausgabe eines Befehls an eine Anwendung wie less weiterzuleiten, verwenden Sie eine Pipeline.

Um die Dateien im Verzeichnis test anzuzeigen, geben Sie den Befehl ls test | less ein. Der Inhalt des Verzeichnisses test wird dann mit less angezeigt. Dies ist nur sinnvoll, wenn die normale Ausgabe mit ls zu lang wäre. Wenn Sie z. B. den Inhalt des Verzeichnisses dev mit ls /dev anzeigen, können Sie nur einen kleinen Teil des Fensters sehen. Die gesamte Liste können Sie mit ls /dev | less anzeigen.

Sie können auch die Ausgabe von Befehlen in einer Datei speichern. Z. B. generiert echo "Test eins" > Inhalt eine neue Datei mit dem Namen Inhalt, die die Wörter Test eins enthält. Mit less Inhalt können Sie sich die Datei anzeigen lassen.

Sie können z. B. mit tr Zeichen aus einer Standardeingabe ersetzen, die aus der Datei Inhalt umgeleitet wurde und das Ergebnis in die Standardausgabe schreiben: ersetzen Sie t durch x, indem Sie tr t x < Inhalt aufrufen. Die Ausgabe von tr wird auf dem Bildschirm angezeigt.

Wenn Sie die Ausgabe als Datei benötigen, leiten Sie die Ausgabe von tr in eine Datei weiter. Um dies zu testen, wechseln Sie in das Verzeichnis test und geben den Befehl tr t x < ../Inhalt > neu ein. Zeigen Sie neu mit less neu an.

Wie die Standardausgabe wird auch die Standardfehlerausgabe an die Konsole gesendet. Um jedoch die Standardfehlerausgabe an eine Datei mit dem Namen fehler zu senden, hängen Sie 2> fehler an den entsprechenden Befehl an. Sowohl die Standardausgabe als auch die Standardfehlerausgabe werden in einer Datei mit dem Namen gesamtausgabe gespeichert, wenn Sie >& gesamtausgabe anhängen. Um schließlich die Ausgabe eines Befehls an eine bereits vorhandene Datei anzuhängen, muss >> anstatt > auf den Befehl folgen.

27.1.8. Archive und Datenkomprimierung

Da Sie nun bereits eine Reihe von Dateien und Verzeichnissen erzeugt haben, möchten Sie vielleicht Archive erstellen und die Daten komprimieren. Angenommen, Sie möchten das gesamte Verzeichnis test in eine Datei packen, die Sie auf einem USB-Stick als Sicherungskopie speichern oder per E-Mail versenden können. Verwenden Sie hierzu den Befehl tar (für tape archiver (Bandarchivierung)). Durch Eingabe von tar --help können Sie alle Optionen für den Befehl tar anzeigen. Die wichtigsten dieser Optionen werden im Folgenden erläutert:

-c

(für create, erstellen) Ein neues Archiv erstellen.

-t

(für table, Tabelle) Inhalt eines Archivs anzeigen.

-x

(für extract, extrahieren) Das Archiv entpacken.

-v

(für verbose, ausführlich) Alle Dateien auf dem Bildschirm anzeigen, während das Archiv erzeugt wird.

-f

(für file, Datei) Wählen Sie einen Dateinamen für die Archivdatei. Beim Erstellen eines Archivs muss diese Option stets zuletzt angegeben werden.

Um das Verzeichnis test mit allen Dateien und Unterverzeichnissen in ein Archiv mit dem Namen testarchiv.tar zu packen, verwenden Sie die Optionen -c und -f. Zu Testzwecken fügen Sie auch -v hinzu, um den Fortschritt des Archivierens zu verfolgen, obwohl diese Option nicht obligatorisch ist. Nachdem Sie cd verwendet haben, um in das Home-Verzeichnis zu wechseln, in dem sich das Verzeichnis test befindet, geben Sie tar -cvf testarchiv.tar test ein. Zeigen Sie danach den Inhalt der Archivdatei mit tar -tf testarchiv.tar an. Das Verzeichnis test mit all seinen Dateien und Verzeichnissen befindet sich immer noch unverändert auf der Festplatte. Um das Archiv zu entpacken, geben Sie tar -xvf testarchiv.tar ein, aber warten Sie damit noch einen Moment.

Für die Dateikomprimierung ist gzip die naheliegende Wahl bzw. bzip2, wenn Sie ein besseres Komprimierungsverhältnis erzielen wollen. Geben Sie einfach gzip testarchiv.tar (oder bzip2 testarchiv.tar ein; in diesem Beispiel wird jedoch gzip verwendet). Mit ls sehen Sie, dass die Datei testarchiv.tar nicht mehr vorhanden ist und dass die Datei testarchiv.tar.gz stattdessen erzeugt wurde. Diese Datei ist viel kleiner und daher besser geeignet für die Übertragung durch E-Mail oder für die Speicherung auf einem USB-Stick.

Entpacken Sie jetzt die Datei im zuvor erzeugten test2-Verzeichnis. Geben Sie hierzu cp testarchiv.tar.gz test2 ein, um die Datei in dieses Verzeichnis zu kopieren. Wechseln Sie in das Verzeichnis mit cd test2. Ein komprimiertes Archiv mit der Erweiterung .tar.gz kann mit dem Befehl gunzip entzippt werden. Geben Sie gunzip testarchiv.tar.gz, ein. Dadurch wird die Datei testarchiv.tar erzeugt, die mit tar -xvf testarchiv.tar entpackt wird. Sie können ein komprimiertes Archiv auch in einem Schritt mit tar -xvf testarchiv.tar.gz entzippen und extrahieren (das Hinzufügen der Option -z ist nicht mehr erforderlich). Mit ls können Sie sehen, dass ein neues Verzeichnis test mit demselben Inhalt erzeugt wurde wie das Verzeichnis test im Home-Verzeichnis.

27.1.9. mtools

mtools ist ein Werkzeugsatz für die Arbeit mit MS-DOS-Dateisystemen. Die in mtools enthaltenen Befehle ermöglichen Ihnen die Adressierung des ersten Datenträgerlaufwerks als a:, wie unter MS-DOS und die Befehle entsprechen MS-DOS-Befehlen mit der Ausnahme, dass ihnen das Präfix m vorangestellt ist.

mdir a:

Zeigt den Inhalt des Datenträgers im Laufwerk a: an.

mcopy Testdatei a:

Kopiert die Datei Testdatei auf eine Diskette.

mdel a:Testdatei

Löscht Testdatei in a:.

mformat a:

Formatiert die Diskette im MS-DOS-Format (mit dem Befehl fdformat).

mcd a:

Bewirkt, dass a: Ihr aktuelles Verzeichnis wird.

mmd a:test

Erzeugt das Unterverzeichnis test auf einer Diskette.

mrd a:test

Löscht das Unterverzeichnis test von der Diskette

27.1.10. Löschen

Nach diesem Schnellkurs sind Sie mit den Grundlagen der Linux-Shell oder der Befehlszeile vertraut. Sie können das Home-Verzeichnis bereinigen, indem Sie die verschiedenen Testdateien und Verzeichnisse mit den Befehlen rm und rmdir löschen. Unter Abschnitt 27.3, „Wichtige Linux-Befehle“ finden Sie eine Liste der wichtigsten Befehle und eine kurze Beschreibung ihrer Funktionen.