Shell
Die Shell in Linux ist ein fundamentales Werkzeug für das Arbeiten mit dem Betriebssystem. Sie ermöglicht die Interaktion mit dem System durch das Eingeben von Textbefehlen.
Was ist eine Shell?
Die Shell ist eine Benutzeroberfläche, die Befehle vom Benutzer entgegennimmt und an das Betriebssystem weitergibt. Es gibt verschiedene Arten von Shells, wobei die bekannteste und am häufigsten verwendete in Linux die Bash (Bourne Again Shell) ist.
Weitere gängige Shells sind:
- Sh (Bourne Shell): Die ursprüngliche Unix-Shell
- Csh (C Shell): Eine Shell, die der C-Programmiersprache ähnelt
- Ksh (Korn Shell): Eine erweiterte Version der Bourne Shell
- Zsh (Z Shell): Eine moderne Shell, die viele erweiterte Funktionen bietet
- Fish (Friendly Interactive Shell): Eine benutzerfreundliche Shell mit intuitiver Syntax und Autovervollständigung
Die Shell ist nicht nur ein Werkzeug zur Befehlseingabe, sondern auch eine vollwertige Programmierumgebung mit eigener Skriptsprache. Das bedeutet, dass komplexe Aufgaben automatisiert und wiederkehrende Prozesse in Skripten gespeichert werden können.
Shell vs. Terminal
Oft werden die Begriffe “Shell” und “Terminal” verwechselt, obwohl sie unterschiedliche Konzepte beschreiben.
Terminal
Das ist die grafische Anwendung, die man sieht und in der man arbeitet. Es ist ein Programm, das die Ein- und Ausgabe verwaltet.
Shell
Die Shell ist das Programm, das innerhalb des Terminals läuft und die eigentliche Befehlsverarbeitung übernimmt.
In modernen Linux-Distributionen gibt es verschiedene Terminal-Emulatoren wie GNOME Terminal, Konsole (KDE), xterm oder Terminator, die alle verschiedene Shells ausführen können.
Eingabe und Ausgabe in der Shell
Die Begriffe Eingabe und Ausgabe (Input und Output, kurz I/O) sind grundlegende Konzepte bei der Verwendung von Shells in Unix- und Linux-Systemen. Sie steuern, wie Daten einem Programm zugeführt und wie Ergebnisse oder Fehlermeldungen vom Programm ausgegeben werden.
Standard-Eingabe (stdin
)
Die Standard-Eingabe (stdin
) repräsentiert die primäre Datenquelle, aus der ein Programm seine Eingaben erhält. Standardmäßig ist stdin
mit der Tastatur verbunden, sodass Benutzereingaben unmittelbar an das laufende Programm weitergeleitet werden.
Standardmäßig ist stdin mit der Tastatur verbunden, was bedeutet:
- Wenn ein Befehl ausgeführt wird, wartet er auf Eingaben vom Benutzer über die Tastatur
- Die Eingabe wird über den Dateideskriptor 0 verarbeitet
- Programme wie
cat
,grep
odersort
lesen standardmäßig vonstdin
, wenn keine Datei angegeben ist
cat
Nach Ausführen des Befehls wartet cat
auf Eingaben von der Tastatur. Jede eingegebene Zeile wird direkt wieder ausgegeben, bis das Programm mit Strg+D beendet wird (EOF).
read name
In diesem Beispiel erwartet der Befehl read
eine Eingabe vom Benutzer. Die Eingabe wird über stdin gelesen und in der Variable name
gespeichert.
Das, was man in eine Variable hineingeschrieben hat, kann über die Variable auch wieder ausgegeben oder anderweitig verwendet werden.
Angenommen, wir geben nach der Ausführung von “read name
” als Eingabe “123
” ein und bestätigen die Eingabe mit der Enter-Taste. Um den Wert von der Variable name
nun abzurufen, können wir in der Shell Folgendes tun.
echo $name
123
Umleistung von stdin
Die Eingabe muss nicht zwingend über die Tastatur erfolgen. Sie lässt sich auch aus Dateien oder über sogenannte Pipes an einen Befehl übergeben.
cat < datei.txt
Hier wird der Inhalt der Datei datei.txt direkt an den Befehl cat übergeben.
Standard-Ausgabe (stdout)
Die Standard-Ausgabe (stdout
) ist der Standardkanal, über den Programme ihre Ergebnisse ausgeben. Standardmäßig erfolgt die Ausgabe direkt auf dem Bildschirm.
echo "Willkommen in der Shell!"
Dieser Befehl gibt den Text “Willkommen in der Shell!” auf stdout aus, und er erscheint im Terminal.
Die Ausgabe kann umgeleitet werden, zum Beispiel in eine Datei.
echo "Hello, World!" > output.txt
Hier wird die Ausgabe nicht auf dem Bildschirm, sondern in der Datei output.txt
gespeichert. Beachte, dass > die Datei überschreibt, wenn sie bereits existiert.
Standard-Fehlerausgabe (stderr)
Standard-Fehlerausgabe (stderr
) ist der Kanal, über den ein Programm Fehlermeldungen ausgibt. Dieser Kanal ist ebenfalls standardmäßig mit dem Terminal verbunden, sodass Fehlermeldungen direkt angezeigt werden. Dies ist besonders nützlich, da Fehlermeldungen oft separat von normalen Ausgaben behandelt werden sollen.
ls /nonexistent_directory
Man kann auch die Fehlerausgabe umleiten.
ls /nonexistent_directory 2> error.log
Hier wird die Fehlermeldung in die Datei error.log
geschrieben, anstatt auf dem Bildschirm angezeigt zu werden. Die 2>
-Syntax spezifiziert, dass stderr umgeleitet wird, da 2 der Dateideskriptor für stderr ist.
Pipes: Kombination von Befehlen
Eine der mächtigsten Funktionen der Shell ist die Möglichkeit, Befehle miteinander zu verbinden. Dies geschieht mit Pipes (|
), die die Ausgabe eines Befehls als Eingabe für den nächsten Befehl verwenden.
ls -la | grep "\.txt$"
Dieser Befehl listet alle Dateien im aktuellen Verzeichnis auf und leitet die Ausgabe an grep
weiter, das nur Zeilen mit “.txt” am Ende filtert, also nur Textdateien anzeigt.
Pipes können beliebig verkettet werden, um komplexe Datenverarbeitungspipelines zu erstellen.
cat log.txt | grep "ERROR" | sort | uniq -c
Dieser Befehlskette:
- Liest den Inhalt von log.txt
- Filtert nur Zeilen mit “ERROR”
- Sortiert diese Zeilen
- Zählt, wie oft jede einzigartige Fehlermeldung vorkommt
Grundlegende Shell-Befehle
Hier sind einige der wichtigsten Shell-Befehle, die jeder Linux-Nutzer kennen sollte.