4 Keine Angst vor der Shell
4 Keine Angst vor der Shell
Lernziele
- Die Vorteile einer textorientierten Kommandozeile bewerten und nutzen können
- Mit der Bourne-Again-Shell (Bash) arbeiten und grundlegende Befehle ausführen
- Struktur von Linux-Kommandos verstehen
Vorkenntnisse
- Grundlegende Kenntnisse im Umgang mit Computern sind hilfreich
4.1 Warum?
Im Vergleich zu anderen modernen Betriebssystemen basiert Linux (wie Unix) stärker auf der Idee, textuelle Kommandos über die Tastatur einzugeben. Das mag manchen vorsintflutlich vorkommen, besonders wenn sie an Systeme wie Windows gewöhnt sind, die seit Jahrzehnten den Eindruck vermitteln, grafische Benutzeroberflächen seien das A und O.
Für viele, die von Windows zu Linux wechseln, ist die Ausrichtung auf die Kommandozeile zunächst ein echter „Kulturschock“ – vergleichbar mit dem, den ein Mensch des 21. Jahrhunderts erleben würde, wenn er plötzlich an den Hof von Kaiser Barbarossa versetzt würde: kein Internet, schlechte Tischmanieren und furchtbare Zahnärzte!
Doch dieser erste Eindruck täuscht. Heute ist die Shell kein Relikt aus der Unix-Ära, sondern ein mächtiges Werkzeug, das sich nahtlos in moderne Workflows integriert – sei es für die Automatisierung, Cloud-Computing oder die Entwicklung von Software. Gleichzeitig bieten die meisten Linux-Distributionen grafische Oberflächen, die denen von Windows oder macOS in nichts nachstehen und in manchen Punkten sogar noch bequemer und leistungsfähiger sind.
Beide Welten ergänzen sich perfekt: Die Shell ermöglicht präzise, leistungsstarke Operationen, während grafische Oberflächen den Einstieg und die tägliche Arbeit erleichtern. Gemäß der Philosophie „Das richtige Werkzeug für jede Aufgabe“ schließen sich grafische Oberflächen und die textorientierte Kommandozeile nicht aus, sondern ergänzen sich hervorragend.
Unter dem Strich bedeutet das: Als angehende Linux-Anwender:in sind Sie gut beraten, sich mit der textorientierten Kommandozeile vertraut zu machen. Die Shell ist eine Abkürzung zu zahlreichen leistungsstarken Operationen, die sich grafisch nur schwer umsetzen lassen. Die Shell abzulehnen, wäre vergleichbar damit, sich in der Fahrschule gegen die Verwendung aller Gänge außer des ersten zu sträuben: Sicher, auch im ersten Gang kommt man ans Ziel – aber nur langsam und mit heulendem Motor. Warum also nicht lernen, wie Sie mit Linux so richtig auf die Tube drücken können? Wenn Sie gut aufpassen, haben wir noch den einen oder anderen Trick für Sie auf Lager.
4.2 Was ist die Shell?
Eine direkte Kommunikation mit dem Linux-Betriebssystemkern ist für den Anwender nicht möglich. Das ist nur über Programme möglich, die ihn über „Systemaufrufe” ansprechen. Sie müssen aber irgendwie solche Programme starten können. Diese Aufgabe übernimmt die Shell, ein besonderes Anwendungsprogramm, das (meistens) Kommandos von der Tastatur liest, als Programmaufrufe interpretiert und ausführt. Die Shell stellt somit eine Art „Oberfläche” für den Computer dar, die das eigentliche Betriebssystem wie eine Nussschale (engl. „shell” – daher der Name) umschließt, sodass es nicht direkt sichtbar ist. Natürlich ist die Shell nur eines von vielen Programmen, die auf das Betriebssystem zugreifen.
💡 Auch die grafischen Benutzeroberflächen aktueller Systeme wie KDE können als „Shells” angesehen werden. Anstatt textuelle Kommandos über die Tastatur einzugeben, geben Sie grafische Kommandos mit der Maus ein. Aber so wie die Textkommandos einer bestimmten „Grammatik” folgen, tun das auch die Mauskommandos. Sie wählen Objekte beispielsweise durch Anklicken aus und legen dann fest, was mit ihnen gemacht werden soll. Öffnen, Kopieren, Löschen usw.
Schon das allererste Unix – Ende der 1960er Jahre – hatte eine Shell. Die älteste Shell, die heute noch außerhalb von Museen zu finden ist, wurde Mitte der 1970er Jahre für „Unix Version 7” von Stephen L. Bourne entwickelt. Diese nach ihrem Entwickler benannte Bourne-Shell enthält alle grundlegenden Funktionen, erfreute sich einer weiten Verbreitung, ist heute aber nur noch sehr selten in ihrer ursprünglichen Form anzutreffen. Zu den klassischen Unix-Shells zählen daneben die C-Shell, die an der Berkeley-Universität für BSD entwickelt wurde und an die Programmiersprache C angelehnt ist, sowie die Korn-Shell, die von David Korn bei AT&T entwickelt wurde und mit der Bourne-Shell weitgehend kompatibel ist, aber einen größeren Funktionsumrange bietet.
Die Bash kombiniert Features der Korn-Shell (ksh) und der C-Shell (csh) und ist nach wie vor die Standard-Shell der meisten Linux-Distributionen (z. B. Ubuntu, Debian, Fedora, Mint). Die aktuelle stabile Version ist Bash 5.3 (Stand: Mai 2025), entwickelt und gepflegt von Chet Ramey im Rahmen des GNU-Projekts. Die Bash ist POSIX-konform und bietet eine Fülle von Funktionen für interaktive Nutzung und Skripting, darunter Job-Control, History-Substitution und erweiterte Variablenverwaltung.1
💡 Über die bereits genannten Shells hinaus gibt es noch zahlreiche weitere. Eine Shell ist ein Anwendungsprogramm wie jedes andere auch unter Unix. Sie benötigen keine besonderen Privilegien, um eine zu schreiben – Sie müssen sich nur an die „Spielregeln” halten, die bestimmen, wie eine Shell mit anderen Programmen kommuniziert.
Shells können interaktiv aufgerufen werden und akzeptieren dann Kommandos vom Benutzer (typischerweise über ein Terminal).
Die allermeisten Shells können ihre Kommandos auch aus Dateien lesen, die vorgefertigte Befehlsfolgen enthalten. Solche Dateien heißen Shellskripte. Die Shell übernimmt dabei im Einzelnen folgende Aufgaben:
- Ein Kommando von der Tastatur (oder aus einer Datei) einlesen.
- Das eingegebene Kommando überprüfen.
- Ausführung des Kommandos (direkt als Builtin oder durch Starten eines externen Programms).
- Das Ergebnis auf dem Bildschirm (oder an anderer Stelle) ausgeben.
- Weiter bei 1.
Neben dieser Standardfunktion verfügen Shells in der Regel über weitere Elemente, wie beispielsweise eine Programmiersprache. Mithilfe von Schleifen, Bedingungen und Variablen sind damit komplexe Befehlsstrukturen realisierbar (in der Regel in Shellskripten, seltener im interaktiven Gebrauch). Durch eine ausgefeilte Verwaltung früherer Kommandos kann die Shell dem Anwender außerdem das Leben erleichtern.
Sie können die Shell mit dem Kommando exit oder der Tastenkombination Strg+D verlassen. Dies funktioniert auch für die Login-Shell, die nach der Anmeldung gestartet wird.
Obwohl es, wie erwähnt, diverse Shells gibt, konzentrieren wir uns hier auf die Bash, die bei den meisten Linux-Distributionen als Standard-Shell dient. Auch die Prüfungen des Linux Professional Institute (LPI) beziehen sich ausschließlich auf die Bash.
Übungen
✏️ 4.1 [2] Melden Sie sich ab und wieder an und prüfen Sie die Ausgabe des Befehls echo $0 in der Loginshell. Starten Sie anschließend mit dem Kommando „bash” eine neue Shell und geben Sie erneut das Kommando „echo $0” ein. Vergleichen Sie die Ausgaben der beiden Kommandos. Fällt Ihnen etwas auf?
4.3 Befehle und ihre Struktur
4.3.1 Wozu Kommandos?
Die Arbeitsweise eines Rechners – ganz egal, welches Betriebssystem darauf installiert ist – lässt sich allgemein in drei Schritten beschreiben:
- Der Rechner wartet auf eine Eingabe durch die Benutzer:in.
- Der Benutzer gibt ein Kommando per Tastatur oder Maus ein.
- Der Rechner führt die erhaltene Anweisung aus.
In einem Linux-System zeigt die Shell eine Eingabeaufforderung (Prompt) auf dem Textbildschirm oder in einem grafischen Terminalprogramm wie Xterm oder Konsole an. Das bedeutet, dass sie bereit ist, einen Befehl entgegenzunehmen. Eine solche Eingabeaufforderung setzt sich oft aus dem Benutzernamen, dem Rechnernamen, dem aktuellen Verzeichnis und einem abschließenden Zeichen zusammen.
hugo@red:/home > _
In diesem Beispiel befindet sich der Benutzer hugo also auf dem Rechner red im Verzeichnis /home. (Aus Platzgründen und um den Text nicht zu sehr auf eine spezielle Linux-Distribution auszurichten, verwenden wir in diesen Unterlagen die neutrale, traditionelle Eingabeaufforderung „$”.)
4.3.2 Wie sind Kommandos aufgebaut?
Ein Kommando in der Shell ist grundsätzlich eine Zeichenfolge, die mit der Eingabetaste („Return“) abgeschlossen wird und anschließend von der Shell ausgewertet wird. Diese Kommandos sind zumeist der englischen Sprache entlehnt und ergeben in ihrer Gesamtheit eine eigene „Kommandosprache”. Damit sie von der Shell verstanden werden können, müssen Kommandos in dieser Sprache gewissen Regeln, einer Syntax, gehorchen.
Um eine Eingabezeile zu interpretieren, versucht die Shell zunächst, diese in einzelne Wörter aufzulösen. Als Trennelement dient dabei, genau wie im richtigen Leben, das Leerzeichen. Das erste Wort in der Zeile ist normalerweise das eigentliche Kommando. Alle weiteren Wörter in der Zeile sind Parameter, die das Kommando genauer spezifizieren. Die Shell unterscheidet zwischen Groß- und Kleinschreibung.
⚠️ Für DOS- und Windows-Anwender kann dies ein Stolperstein sein, da die Shell zwischen Groß- und Kleinschreibung unterscheidet. Linux-Kommandos werden in der Regel komplett kleingeschrieben (Ausnahmen bestätigen die Regel) und nicht anders interpretiert. Siehe hierzu auch Abschnitt 4.3.1.
💡 Beim Trennen von Wörtern in einem Kommando ist ein einzelnes Leerzeichen so gut wie viele – die Shell macht da keinen Unterschied. Genau genommen besteht die Shell nicht einmal auf Leerzeichen, Tabulatorzeichen sind auch erlaubt. Das ist vor allem beim Lesen von Kommandos aus Dateien von Bedeutung, denn die Bash lässt Sie keine Tabulatorzeichen eintippen.
💡 Sie können sogar den Zeilentrenner (↩) verwenden, um ein langes Kommando auf mehrere Eingabezeilen zu verteilen. Sie müssen jedoch direkt davor ein „\” setzen, damit die Shell das Kommando nicht vorzeitig für vollständig hält.
Die an ein Kommando übergebenen Parameter lassen sich grob in zwei Klassen einteilen:
-
Parameter, die mit einem Minuszeichen „-” beginnen, werden Optionen genannt. Diese können angegeben werden, müssen aber meistens nicht – die genauen Vorgaben hängen vom jeweiligen Kommando ab. Bildlich gesprochen handelt es sich hierbei um „Schalter”, mit denen Sie Aspekte des jeweiligen Kommandos ein- oder ausschalten können. Wenn Sie mehrere Optionen übergeben möchten, können diese (in der Regel) hinter einem einzigen Minuszeichen zusammengefasst werden, d. h., die Parameterfolge „-a -l -F” entspricht „-alF”. Viele Programme haben mehr Optionen, als sich leicht merkbar auf Buchstaben abbilden lassen. Aus Gründen der besseren Lesbarkeit unterstützen sie oft zusätzlich „lange Optionen” (neben „normalen” Optionen, die dasselbe tun). Lange Optionen werden meist mit zwei Minuszeichen eingeleitet und können nicht zusammengefasst werden: „--fasel --blubb”.
-
Parameter ohne einleitendes Minuszeichen werden »Argumente« genannt. Dies sind oft die Namen der Dateien, die mit dem Kommando bearbeitet werden sollen.
Die allgemeine Befehlsstruktur lässt sich also wie folgt darstellen:
-
Kommando – „Was wird gemacht?”
-
Optionen: „Wie wird es gemacht?”
-
Argumente – „Womit wird es gemacht?“
In der Regel stehen hinter einem Kommando zunächst die Optionen und anschließend die Argumente. Allerdings bestehen nicht alle Kommandos darauf: Bei manchen können Sie Optionen und Argumente beliebig mischen und sie verhalten sich so, als stünden alle Optionen direkt hinter dem Kommando. Bei anderen werden Optionen dagegen erst in dem Moment beachtet, in dem das Kommando beim Abarbeiten der Kommandozeile auf sie stößt.
⚠️ Die Kommandostruktur heutiger Unix-Systeme (einschließlich Linux) ist über einen Zeitraum von fast 40 Jahren historisch gewachsen. Daher weist sie diverse Inkonsistenzen und kleine Überraschungen auf. Wir sind auch der Meinung, dass hier gründlich aufgeräumt werden müsste, aber 30 Jahre alte Shellskripte lassen sich leider nicht einfach ignorieren. Seien Sie also darauf gefasst, dass Sie sich hin und wieder mit gewissen Merkwürdigkeiten abfinden müssen.
4.3.3 Arten von Kommandos (intern und extern)
In Shells gibt es prinzipiell zwei Arten von Kommandos:
-
Interne Kommandos: Diese Befehle werden von der Shell selbst zur Verfügung gestellt. Bei der Bash gehören etwa 30 Kommandos zu dieser Gruppe. Sie haben den Vorteil, dass sie besonders schnell ausgeführt werden können. Einige Kommandos (zum Beispiel exit oder cd) können nur als interne Kommandos realisiert werden, da sie den Zustand der Shell selbst beeinflussen.
-
Externe Kommandos: Diese Kommandos führt die Shell nicht selbst aus, sondern startet dafür ausführbare Dateien, die im Dateisystem üblicherweise in Verzeichnissen wie /bin oder /usr/bin abgelegt sind. Als Benutzer können Sie Ihre eigenen Programme der Shell bekannt machen, sodass diese wie alle anderen externen Kommandos ausgeführt werden können.
Um die Art eines Kommandos herauszufinden, können Sie das Kommando type benutzen. Wenn Sie den Befehlsnamen als Argument übergeben, wird die Art des Kommandos oder der entsprechende Verzeichnispfad ausgegeben, etwa:
$ type echo
echo is a shell builtin
$ type date
date is /bin/date
echo ist ein nettes Kommando, das seine Parameter einfach nur ausgibt.
$ echo Ha, wackrer Tell! Das gleicht dem Waidgesellen!
Ha, wackrer Tell! Das gleicht dem Waidgesellen!
date liefert das aktuelle Datum und die Uhrzeit, wobei diese gegebenenfalls an die aktuelle Zeitzone und Spracheinstellung angepasst werden.
$ date
Mo 12. Mär 09:57:34 CET 2012
Mehr über die Befehle echo und date erfahren Sie in Kapitel 9.
Hilfe zu den internen Kommandos der Bash erhalten Sie übrigens über das Kommando help.
$ help type
type: type [-afptP] name [name ..]
For each NAME, indicate how it would be interpreted if used as a command name.
If the -t option is used, `type' outputs a single word which is one of
`alias', `keyword', `function', `builtin', `file' or `', if NAME is an
✁✁✁✁✁
Übungen
✏️ 4.2 [2] Welche der folgenden Kommandos sind bei der Bash extern realisiert? Und welche intern? Die Kommandos sind: alias, echo, rm, test.
Wie bereits weiter oben erwähnt, unterscheidet die Shell bei der Kommandoeingabe zwischen Groß- und Kleinschreibung. Dies betrifft nicht nur die Kommandos selbst, sondern auch Optionen und Parameter (in der Regel Dateinamen). Die Shell ist hier case-sensitive.
Außerdem sollten Sie beachten, dass die Shell bestimmte Zeichen in der Eingabe speziell interpretiert. An erster Stelle ist hier das bereits erwähnte Leerzeichen zu nennen, das als Trennzeichen für Wörter auf der Kommandozeile dient. Weitere Zeichen mit Sonderbedeutung sind: $, &, ;, (, ), {, }, [, ], *, !, <, >, «, -
Wenn Sie eines dieser Zeichen verwenden möchten, ohne dass es von der Shell interpretiert wird, müssen Sie es maskieren. Hierfür können Sie den Rückstrich „\” zum Maskieren eines einzelnen Sonderzeichens oder einfache oder doppelte Anführungszeichen („…”, "…”) zum Maskieren mehrerer Sonderzeichen verwenden. Ein Beispiel:
$ touch 'Neue Datei'
Durch die Anführungszeichen bezieht sich dieses Kommando auf eine Datei namens „Neue Datei”. Ohne Anführungszeichen wären zwei Dateien namens „Neue” und „Datei” gemeint.
💡 Die anderen Sonderzeichen zu erklären, würde an dieser Stelle zu weit führen. Die meisten tauchen an anderer Stelle in dieser Schulungsunterlage auf. Alternativ können Sie sich auch an die Bash-Dokumentation wenden.
4.4 Kommandos in diesem Kapitel
| Kommando | Beschreibung | manpage |
|---|---|---|
| bash | Die ”Bourne-Again-Shell“, ein interaktiver Kommandointerpreter | bash(1) |
| date | Gibt Datum und Uhrzeit aus | date(1) |
| echo | Gibt alle seine Parameter durch Leerzeichen getrennt auf der Standardausgabe aus | "bash(1), echo(1) |
| help | Zeigt Hilfe für bash-Kommandos | bash(1) |
| konsole | Ein ”Terminalemulator“ für KDE | KDE : help:/konsole |
| type | Bestimmt die Art eines Kommandos (intern, extern, Alias) | bash(1) |
| xterm | Ein ”Terminalemulator“ für das X-Window-System | xterm(1) |
| terminator | Ein Terminalemulator mit Split-Screen-Funktion, ideal für Multitasking | terminator(1) |
4.5 Zusammenfassung
-
Die Shell liest Benutzerkommandos ein und führt sie aus.
-
Die meisten Shells haben die Eigenschaften von Programmiersprachen und erlauben das Erstellen von Shellskripten. Dabei handelt es sich um vorgekochte Kommandofolgen, die in Dateien abgelegt werden.
-
Kommandos haben Optionen und Argumente. Die Optionen legen fest, wie das Kommando wirkt, und die Argumente, worauf es wirkt.
-
Shells unterscheiden zwischen internen Kommandos, die in der Shell selbst implementiert sind, und externen Kommandos, für die andere Programme als Hintergrundprozesse gestartet werden.