VMware ESXi and vSphere Cluster Management
Die Bash-Shell: Grundlagen des Kommandozeileninterpreters unter Linux
Lerne, was Bash, Shell, Terminal und Kommandozeile bedeuten. Mit Grundlagen zu Befehlen, Navigation, Tab-Vervollständigung, Verlauf, Pipelines, Umleitungen und Variablen.
Was ist Bash?
Bash ist ein Kommandozeileninterpreter für Unix- und Linux-Systeme. Ein Kommandozeileninterpreter analysiert Text, den du eingibst, erkennt darin Befehle und Ausdrücke und startet anschließend passende Programme oder führt Shell-Funktionen aus.
Der Name Bash steht für „Bourne Again Shell“. Bash ist Bestandteil des GNU-Projekts und baut historisch auf der Bourne-Shell sh auf. Brian Fox schrieb die ursprüngliche Bash-Implementierung. Heute ist Bash eine weit verbreitete Shell im Unix- und Linux-Umfeld.
Bash hat zwei eng verbundene Rollen:
- Als interaktive Umgebung nimmt Bash Befehle entgegen und führt sie direkt aus.
- Als Shell-Sprache beschreibt Bash Abläufe in Skripten, zum Beispiel wiederholte Dateiverarbeitung oder automatische Sicherungen.
Auf vielen Linux-Systemen ist Bash häufig voreingestellt. Welche Login-Shell tatsächlich für einen Benutzer konfiguriert ist, hängt jedoch von Distribution, Systemkonfiguration und Benutzerkonto ab.
Terminal, Shell und Kommandozeile unterscheiden
Die Begriffe werden im Alltag oft vermischt, bezeichnen aber unterschiedliche Dinge.
| Begriff | Aufgabe | Beispiel | Typisches Missverständnis |
|---|---|---|---|
| Terminal | Programm oder Fenster für textbasierte Ein- und Ausgabe | Eine Terminal-App auf dem Linux-Desktop | Ein Terminal ist nicht automatisch Bash. |
| Shell | Programm, das Befehle interpretiert und Prozesse startet | Bash, zsh, fish oder dash | Jede Shell verhält sich exakt gleich. |
| Kommandozeile | Textbasierte Arbeitsweise beziehungsweise Eingabeaufforderung | pwd eingeben und mit Enter ausführen | Die Kommandozeile ist ein bestimmtes Programm. |
Ein Terminalemulator stellt unter einer grafischen Oberfläche ein Terminalfenster bereit. In diesem Fenster wird normalerweise eine Shell-Sitzung gestartet. Das Terminal nimmt Tastatureingaben entgegen und zeigt Ausgaben an; die Shell entscheidet, wie eine Eingabe interpretiert wird.
Im selben Terminal kann statt Bash beispielsweise zsh, fish, ksh oder dash laufen. Terminal und Shell sind daher nicht dasselbe.
Bash starten und die aktive Shell erkennen
Unter einer grafischen Linux-Desktopumgebung öffnest du die Terminal-Anwendung meist über das Anwendungsmenü. Häufig funktioniert auch die Suche nach Begriffen wie „Terminal“ oder „Konsole“. Manche Desktopumgebungen bieten zusätzlich eine Tastenkombination an. Nach dem Start erscheint ein Fenster mit einer Eingabeaufforderung, dem Prompt.
Mit diesen Befehlen kannst du verschiedene Ebenen unterscheiden:
echo $0
echo $SHELL
ps -p $$ -o comm=
echo $0zeigt typischerweise den Namen der aufgerufenen Shell-Sitzung.echo $SHELLzeigt die konfigurierte Login-Shell des Benutzers. Das ist nicht zwingend die Shell, die gerade tatsächlich läuft.ps -p $$ -o comm=fragt den Prozessnamen der aktuellen Shell ab.$$steht in Bash für die Prozess-ID der aktuellen Shell.
Ein Prompt kann beispielsweise so aussehen:
anna@rechner:~/projekte$
Typische Bestandteile sind der Benutzername, der Rechnername, das aktuelle Arbeitsverzeichnis und ein Berechtigungszeichen. Ein $ steht häufig für einen normalen Benutzer, ein # häufig für den Benutzer root. Das genaue Aussehen des Prompts kann angepasst werden.
Das Grundschema eines Bash-Befehls
Viele Eingaben folgen dem Schema:
befehl optionen argumente
- Der Befehl bezeichnet ein Programm oder eine Shell-Funktion.
- Eine Option verändert das Verhalten des Befehls. Optionen beginnen häufig mit einem Bindestrich.
- Ein Argument ist ein Wert, eine Datei oder ein Ziel, auf das der Befehl angewendet wird.
Beispiele:
pwd
ls -l
ls -l /tmp
pwd zeigt das aktuelle Arbeitsverzeichnis. Bei ls -l ist ls der Befehl und -l die Option für eine ausführlichere Darstellung. In ls -l /tmp ist /tmp zusätzlich ein Argument.
Die Shell führt eine Eingabe normalerweise erst aus, wenn du die Eingabetaste drückst. Leerzeichen trennen dabei Bestandteile. Soll ein Leerzeichen zu einem Dateinamen oder Argument gehören, schützt du es mit Anführungszeichen:
echo hallo welt
echo "hallo welt"
echo 'hallo welt'
Die erste Variante übergibt zwei getrennte Wörter an echo; die beiden anderen schützen das Leerzeichen als Teil eines Arguments. Doppelte und einfache Anführungszeichen haben in Bash nicht in allen Situationen dieselbe Bedeutung.
Zentrale Funktionen für die interaktive Arbeit
Tab-Vervollständigung
Mit der Tabulatortaste ergänzt Bash Befehls-, Datei- und Verzeichnisnamen. Das spart Zeit und reduziert Tippfehler.
mkdir -p ~/bash-demo
cd ~/bash-demo
touch bericht.txt bericht.pdf bild.png
ls ber<Tab>
Wenn nur ein Name mit dem Präfix ber beginnt, ergänzt Bash ihn direkt. Gibt es mehrere passende Namen, ergänzt Bash nur den gemeinsamen Teil oder zeigt nach einem weiteren Druck auf Tab die möglichen Treffer an. Mit pwd prüfst du das aktuelle Verzeichnis, mit ls die tatsächlich vorhandenen Namen.
Bei Leerzeichen müssen Namen passend geschützt oder maskiert werden, zum Beispiel "mein bericht.txt". Wenn Tab nicht ergänzt, kann der Präfix mehrdeutig sein, der Name im falschen Verzeichnis liegen oder Sonderzeichen enthalten.
Befehlsverlauf
Bash speichert zuvor eingegebene Befehle im Befehlsverlauf. Mit der Pfeil-nach-oben-Taste holst du frühere Eingaben zurück und kannst sie bearbeiten. Mit history wird eine nummerierte Liste angezeigt:
history
Eine Suche ist je nach Konfiguration beispielsweise mit Ctrl+R möglich. Die Kurzform !Nummer führt einen Verlaufseintrag erneut aus. Verwende sie vorsichtig, denn ein alter Befehl kann inzwischen ein anderes Ziel treffen oder privilegierte beziehungsweise löschende Aktionen enthalten.
Platzhalter und Globbing
Platzhalter, auch Globbing genannt, sind Muster für Dateinamen. Bash erweitert diese Muster gewöhnlich, bevor das Programm gestartet wird.
ls *.txt
ls datei?.txt
ls datei[12].txt
*passt auf beliebig viele Zeichen, auch auf kein Zeichen.?passt auf genau ein Zeichen.[12]passt auf genau ein Zeichen aus der angegebenen Zeichenklasse.
*.txt wählt beispielsweise alle passenden Dateien mit der Endung .txt. datei?.txt passt zu datei1.txt, aber nicht zu datei10.txt. Groß- und Kleinschreibung wird normalerweise unterschieden. In Anführungszeichen wie "*.txt" wird das Muster nicht erweitert, sondern wörtlich übergeben.
Pipelines
Das Pipe-Zeichen | verbindet Befehle. Die Standardausgabe des linken Befehls wird zur Standardeingabe des rechten Befehls:
echo "Text" | grep "Text"
ls | grep ".txt"
Im zweiten Beispiel erzeugt ls eine Liste, die an grep weitergegeben wird. Eine Pipeline verbindet den Datenfluss, ohne dass du die Zwischenausgabe zunächst in einer Datei speichern musst.
Umleitungen
Mit Umleitungen lenkst du Standardausgabe oder Standardfehler in andere Ziele. Der Operator > erstellt eine Datei oder überschreibt deren bisherigen Inhalt:
echo "Text" > ausgabe.txt
echo "Weitere Zeile" >> ausgabe.txt
>> hängt die Ausgabe an. Standardfehler kann beispielsweise mit 2>fehler.txt umgeleitet werden. Mit >datei 2>&1 werden Standardausgabe und Standardfehler in dieselbe Datei gelenkt. Prüfe vor > immer den Dateinamen, weil vorhandene Inhalte verloren gehen können.
Kommandosubstitution
Bei der Kommandosubstitution wird die Ausgabe eines Befehls in einen anderen Befehl oder Ausdruck eingesetzt. Die moderne Schreibweise verwendet $():
datum=$(date +%F)
echo "$datum"
echo "Sicherung-$datum.tar"
Zuerst wird date +%F ausgeführt. Die erzeugte Ausgabe wird anschließend in der Variablen datum gespeichert und verwendet.
Variablen und Umgebungsvariablen
Eine Variable ist ein benannter Wert innerhalb der Shell. Beim Setzen stehen keine Leerzeichen um das Gleichheitszeichen:
projekt="demo"
echo "$projekt"
Ein Dollarzeichen liest den Wert aus. Die Anführungszeichen um "$projekt" schützen den Inhalt, falls er Leerzeichen enthält. Eine Umgebungsvariable wird zusätzlich an neu gestartete Prozesse vererbt. Das geschieht beispielsweise mit export:
export PROJEKT="demo"
echo "$PROJEKT"
Eine wichtige Umgebungsvariable ist PATH. Sie enthält Verzeichnisse, in denen Bash nach ausführbaren Befehlen sucht. Mit command -v befehl lässt sich prüfen, ob ein Befehl gefunden wird.
Wichtige Bash-Funktionen im Überblick
| Funktion | Syntax oder Taste | Wirkung | Kurzes Beispiel |
|---|---|---|---|
| Tab-Vervollständigung | Tab | Ergänzt eindeutige Namen oder zeigt Treffer | cd ~/Doc<Tab> |
| Befehlsverlauf | Pfeil nach oben, history | Holt frühere Eingaben zurück | history |
| Platzhalter | *, ?, [] | Wählt passende Dateinamen aus | ls *.txt |
| Pipeline | | | Gibt Ausgabe an den nächsten Befehl weiter | ls | grep txt |
| Ausgabeumleitung | >, >> | Schreibt oder hängt Ausgabe an eine Datei | echo ok >> log.txt |
| Kommandosubstitution | $() | Setzt eine Befehlsausgabe in einen Ausdruck ein | echo $(date +%F) |
| Variable | $NAME | Liest einen gespeicherten Wert | echo "$HOME" |
Häufige Sonderzeichen in Bash
| Zeichen oder Syntax | Bedeutung | Beispiel | Vorsichtshinweis |
|---|---|---|---|
* | Beliebig viele Zeichen im Dateimuster | ls *.log | Kann sehr viele Dateien auswählen. |
? | Genau ein Zeichen im Dateimuster | ls bild?.png | Passt nicht zu null oder mehreren Zeichen. |
[] | Zeichenklasse | ls datei[0-9] | Das Muster muss zur tatsächlichen Schreibweise passen. |
| | Pipeline | ls | grep txt | Der zweite Befehl erhält nur die weitergeleitete Ausgabe. |
> | Ausgabe schreiben und überschreiben | echo ok > log.txt | Vorhandener Dateiinhalt wird ersetzt. |
>> | Ausgabe anhängen | echo ok >> log.txt | Wiederholte Ausführung vergrößert die Datei. |
$() | Kommandosubstitution | echo $(date) | Die Ausgabe kann Leerzeichen oder Sonderzeichen enthalten. |
$VARIABLE | Variablenwert lesen | echo "$HOME" | Quoting verhindert unerwünschte Aufteilung. |
"" | Erhält Leerzeichen, erlaubt aber bestimmte Ersetzungen | echo "$projekt" | Variablen und Kommandos werden meist weiterhin ersetzt. |
'' | Schützt den Inhalt weitgehend wörtlich | echo '$HOME' | $HOME wird hier nicht ersetzt. |
Bash und andere Shells
Bash ist nicht dasselbe wie sh. Die Bourne-Shell bezeichnet eine historische Shell und außerdem eine Schnittstelle beziehungsweise Sprachtradition. Auf manchen Systemen verweist sh auf eine andere, schlankere Shell wie dash. Weitere verbreitete Shells sind zsh, fish und ksh.
| Shell | Typischer Einsatz | Kompatibilität zu sh | Besondere Hinweise |
|---|---|---|---|
| bash | Interaktive Linux-Nutzung und Skripte | Viele sh-Konstrukte, zusätzlich Bash-Erweiterungen | Verbreitet, mit umfangreicher Vervollständigung und Historie |
| sh | Portables Shell-Interface und ältere Skripte | Ziel ist meist POSIX-Kompatibilität | Ist auf modernen Systemen nicht zwingend Bash. |
| dash | Schnelle, schlanke System-Shell | Stark auf POSIX-sh-Syntax ausgerichtet | Viele Bash-spezifische Funktionen fehlen. |
| zsh | Komfortable interaktive Arbeit | Teilweise kompatibel, aber nicht identisch | Umfangreiche Anpassungs- und Vervollständigungsfunktionen |
| fish | Einsteigerfreundliche interaktive Nutzung | Nicht als sh-kompatible Skriptshell gedacht | Eigene Syntax und eigene interaktive Konzepte |
Syntax, interaktive Funktionen und Skriptkompatibilität können sich zwischen Shells unterscheiden. Ein Skript mit dem Shebang #!/bin/bash verlangt ausdrücklich Bash und sollte nicht pauschal mit sh gestartet werden. Alternativ legt #!/usr/bin/env bash fest, dass Bash über die Umgebung gesucht wird.
#!/usr/bin/env bash
Wenn ein Skript POSIX-kompatibel sein soll, müssen Bash-spezifische Konstrukte vermieden und der vorgesehene Interpreter beachtet werden.
Typische Probleme und Lösungen
„command not found“
- Prüfe die Schreibweise und nutze Tab-Vervollständigung.
- Mit
command -v befehlprüfst du, ob ein ausführbares Programm gefunden wird. - Bei eigenen Skripten kontrollierst du Pfad, Ausführungsrechte, Shebang und
PATH.
Ein Skript funktioniert mit Bash, aber nicht mit sh
Das Skript verwendet wahrscheinlich Bash-spezifische Syntax oder sh verweist auf eine schlankere Shell. Setze den passenden Shebang, starte es mit bash skriptname oder überarbeite es für POSIX-Kompatibilität.
Tab ergänzt keinen Namen
Der Präfix kann mehrdeutig sein, das Arbeitsverzeichnis kann falsch sein oder der Dateiname kann Sonderzeichen enthalten. Drücke Tab ein zweites Mal, prüfe mit pwd und ls den Ort und verwende bei Leerzeichen geeignete Anführungszeichen.
Eine Umleitung leert eine Datei
> überschreibt den bisherigen Inhalt. Verwende zum Anhängen >> und prüfe wichtige Dateinamen vor der Ausführung sorgfältig.
Ein Platzhalter liefert zu viele oder keine Dateien
Kontrolliere die tatsächlichen Namen mit ls, beachte Groß- und Kleinschreibung und prüfe, ob Anführungszeichen die Mustererweiterung verhindert haben.
Vom Einzelbefehl zum Shell-Skript
Bash ist ein mächtiges Werkzeug für interaktive Aufgaben und Automatisierung. Einzelne Befehle lassen sich zunächst mit Pipelines, Umleitungen und Variablen verbinden. Mehrere Befehle können anschließend in einem Shell-Skript mit Bedingungen, Schleifen und Funktionen organisiert werden.
Für den nächsten Lernschritt sind Linux-Dateisysteme, Datei- und Verzeichnisrechte, Prozesse, Standardausgabe und Standardfehler, Textverarbeitung mit grep, sort, cut und awk sowie Bash-Skripting besonders wichtig. Shell-Platzhalter sind dabei von regulären Ausdrücken zu unterscheiden: Beide verwenden Muster, aber in unterschiedlichen Werkzeugen und mit unterschiedlichen Regeln.
Eine weiterführende Übersicht findest du unter Die Bash-Shell.