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.

BegriffAufgabeBeispielTypisches Missverständnis
TerminalProgramm oder Fenster für textbasierte Ein- und AusgabeEine Terminal-App auf dem Linux-DesktopEin Terminal ist nicht automatisch Bash.
ShellProgramm, das Befehle interpretiert und Prozesse startetBash, zsh, fish oder dashJede Shell verhält sich exakt gleich.
KommandozeileTextbasierte Arbeitsweise beziehungsweise Eingabeaufforderungpwd eingeben und mit Enter ausführenDie 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 $0 zeigt typischerweise den Namen der aufgerufenen Shell-Sitzung.
  • echo $SHELL zeigt 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

FunktionSyntax oder TasteWirkungKurzes Beispiel
Tab-VervollständigungTabErgänzt eindeutige Namen oder zeigt Treffercd ~/Doc<Tab>
BefehlsverlaufPfeil nach oben, historyHolt frühere Eingaben zurückhistory
Platzhalter*, ?, []Wählt passende Dateinamen ausls *.txt
Pipeline|Gibt Ausgabe an den nächsten Befehl weiterls | grep txt
Ausgabeumleitung>, >>Schreibt oder hängt Ausgabe an eine Dateiecho ok >> log.txt
Kommandosubstitution$()Setzt eine Befehlsausgabe in einen Ausdruck einecho $(date +%F)
Variable$NAMELiest einen gespeicherten Wertecho "$HOME"

Häufige Sonderzeichen in Bash

Zeichen oder SyntaxBedeutungBeispielVorsichtshinweis
*Beliebig viele Zeichen im Dateimusterls *.logKann sehr viele Dateien auswählen.
?Genau ein Zeichen im Dateimusterls bild?.pngPasst nicht zu null oder mehreren Zeichen.
[]Zeichenklassels datei[0-9]Das Muster muss zur tatsächlichen Schreibweise passen.
|Pipelinels | grep txtDer zweite Befehl erhält nur die weitergeleitete Ausgabe.
>Ausgabe schreiben und überschreibenecho ok > log.txtVorhandener Dateiinhalt wird ersetzt.
>>Ausgabe anhängenecho ok >> log.txtWiederholte Ausführung vergrößert die Datei.
$()Kommandosubstitutionecho $(date)Die Ausgabe kann Leerzeichen oder Sonderzeichen enthalten.
$VARIABLEVariablenwert lesenecho "$HOME"Quoting verhindert unerwünschte Aufteilung.
""Erhält Leerzeichen, erlaubt aber bestimmte Ersetzungenecho "$projekt"Variablen und Kommandos werden meist weiterhin ersetzt.
''Schützt den Inhalt weitgehend wörtlichecho '$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.

ShellTypischer EinsatzKompatibilität zu shBesondere Hinweise
bashInteraktive Linux-Nutzung und SkripteViele sh-Konstrukte, zusätzlich Bash-ErweiterungenVerbreitet, mit umfangreicher Vervollständigung und Historie
shPortables Shell-Interface und ältere SkripteZiel ist meist POSIX-KompatibilitätIst auf modernen Systemen nicht zwingend Bash.
dashSchnelle, schlanke System-ShellStark auf POSIX-sh-Syntax ausgerichtetViele Bash-spezifische Funktionen fehlen.
zshKomfortable interaktive ArbeitTeilweise kompatibel, aber nicht identischUmfangreiche Anpassungs- und Vervollständigungsfunktionen
fishEinsteigerfreundliche interaktive NutzungNicht als sh-kompatible Skriptshell gedachtEigene 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 befehl prü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.