VMware ESXi and vSphere Cluster Management

Was ist eine Shell? Grundlagen der Linux-Kommandozeile

Erklärt verständlich den Unterschied zwischen Shell, Terminal, Konsole und Kernel sowie erste Bash-Befehle, Shells, Skripte und sicheren Einstieg.

Eine Shell ist eine textbasierte Benutzerschnittstelle für ein Betriebssystem. Sie nimmt Befehle entgegen, interpretiert deren Bestandteile und veranlasst die Ausführung von Programmen oder Systemfunktionen. Unter Linux ist die Shell ein wichtiger Zugang zum System, auch wenn die meisten Distributionen zusätzlich eine grafische Oberfläche anbieten.

Was ist eine Shell?

Der Begriff Shell bedeutet wörtlich „Schale“. Gemeint ist eine Schicht um den Betriebssystemkern, den Kernel. Die Shell verarbeitet Eingaben des Benutzers und übersetzt sie in Aktionen, die Programme oder der Kernel ausführen können.

Gibt ein Benutzer beispielsweise ls ein, erkennt die Shell den Befehl, sucht ein passendes Programm und startet es. Die Ausgabe wird anschließend wieder im Terminal angezeigt. Die Shell ist also ein Befehlsinterpreter: Sie liest, zerlegt und interpretiert eine Kommandozeile.

Eine Shell kann dabei unter anderem:

  • Programme starten und Systembefehle ausführen,
  • Dateien und Verzeichnisse verwalten,
  • Variablen und Umgebungen verarbeiten,
  • Ausgaben umleiten und Befehle miteinander verbinden,
  • mehrere Befehle in Skripten automatisiert ausführen.

Shell, Terminal, Konsole und Kernel unterscheiden

Diese Begriffe werden im Alltag oft vermischt, bezeichnen aber unterschiedliche Dinge.

BegriffAufgabeBeispiel
ShellBefehle lesen, interpretieren und Programme oder Systemaktionen startenBash oder Zsh
TerminalAnwendung oder Gerät, über das eine Shell bedient wirdEin Terminalemulator in einer grafischen Linux-Oberfläche
KernelZentraler Betriebssystembestandteil; verwaltet Hardware, Prozesse und RessourcenDer Linux-Kernel
PromptZeigt an, dass die Shell auf eine Eingabe wartetuser@rechner:~$

Terminal und Terminalemulator

Ein Terminal war ursprünglich ein Gerät zur Eingabe und Ausgabe eines Computers. Auf einem modernen Desktop ist meist ein Terminalemulator gemeint: ein Programm, das ein textbasiertes Fenster bereitstellt und darin eine Shell startet.

Das Terminal selbst interpretiert normalerweise keine Linux-Befehle. Es überträgt die Eingabe an die laufende Shell und zeigt deren Ausgabe an. Deshalb kann in demselben Terminalemulator Bash, Zsh oder eine andere Shell laufen.

Die Konsole

Konsole ist ein historischer und allgemeiner Begriff für eine direkte textbasierte Bedienoberfläche. Im Linux-Alltag kann damit ein Terminalfenster, eine virtuelle Textkonsole oder allgemein die Kommandozeile gemeint sein. Für das Verständnis ist entscheidend: Die Shell ist der Befehlsinterpreter, während das Terminal den Zugang dazu bereitstellt.

Der Kernel

Der Kernel ist der zentrale Teil des Betriebssystems. Er verwaltet beispielsweise Prozesse, Arbeitsspeicher, Geräte und Zugriffe auf Dateien. Die Shell kommuniziert nicht einfach direkt mit der Hardware. Sie startet Programme, und diese verwenden Systemaufrufe, über die der Kernel die angeforderten Aktionen kontrolliert ausführt.

Warum ist die Shell unter Linux wichtig?

Die grafische Oberfläche ist für viele alltägliche Aufgaben bequem. Die Shell bleibt dennoch besonders nützlich, weil sie direkten, präzisen und gut automatisierbaren Zugriff auf zahlreiche Linux-Funktionen ermöglicht.

  • Programme ausführen: Anwendungen und Systembefehle lassen sich mit Namen und Optionen starten.
  • Dateien verwalten: Verzeichnisse können durchsucht, erstellt, kopiert, verschoben oder gelöscht werden.
  • Textdateien bearbeiten: Konfigurationsdateien und Protokolle lassen sich anzeigen, durchsuchen und mit geeigneten Werkzeugen bearbeiten.
  • Administration: Viele Verwaltungsaufgaben werden über Befehle oder Skripte erledigt.
  • Fehlersuche: Meldungen, Prozesse, Zugriffsrechte und Systemzustände sind oft über die Kommandozeile detailliert prüfbar.
  • Automatisierung: Wiederkehrende Abläufe können in einem Shell-Skript gespeichert und reproduzierbar ausgeführt werden.

Die Kommandozeile ist damit nicht grundsätzlich besser als eine grafische Oberfläche. Beide bedienen dasselbe Betriebssystem auf unterschiedliche Weise. Die Shell bietet besonders viel Kontrolle und ist auf Servern häufig der wichtigste Zugang, weil dort nicht immer eine grafische Oberfläche installiert ist.

Wie läuft ein Befehl ab?

Eine typische Eingabe besteht aus einem Befehl, optionalen Optionen und Argumenten:

ls -l Dokumente
  • ls ist der Befehl.
  • -l ist eine Option, die hier eine ausführlichere Darstellung anfordert.
  • Dokumente ist ein Argument, also das Ziel, auf das der Befehl angewendet wird.

Der Prompt signalisiert, dass die Shell bereit ist. Ein Beispielprompt kann so aussehen:

anna@linux-pc:~$

In diesem Beispiel enthält der Prompt den Benutzernamen, den Rechnernamen und das aktuelle Verzeichnis. Das Dollarzeichen ist häufig ein Hinweis auf eine normale Benutzer-Shell. Ein Prompt mit # wird oft für den Administrator verwendet, ist aber von der Konfiguration abhängig.

Nach der Eingabe führt die Shell typischerweise folgende Schritte aus:

  1. Sie liest die Zeichenfolge und zerlegt sie in Befehl, Optionen und Argumente.
  2. Sie verarbeitet besondere Shell-Syntax, beispielsweise Variablen oder Anführungszeichen.
  3. Sie sucht den Befehl, häufig in den Verzeichnissen der Umgebungsvariable PATH.
  4. Sie startet das Programm oder führt einen eingebauten Shell-Befehl aus.
  5. Sie zeigt normale Ausgabe und Fehlermeldungen im Terminal an.
  6. Sie erhält einen numerischen Exit-Status zurück.

Ein Exit-Status von 0 bedeutet üblicherweise Erfolg. Ein anderer Wert signalisiert, dass ein Problem aufgetreten ist. Der Status des zuletzt ausgeführten Befehls lässt sich in Bash anzeigen:

echo $?

Häufige Shells

Linux-Systeme können mehrere Shells bereitstellen. Sie erfüllen ähnliche Grundaufgaben, unterscheiden sich aber in Syntax, interaktiven Komfortfunktionen und der Kompatibilität von Skripten.

ShellLangform oder HerkunftTypische EinordnungBesonderheit
BashBourne Again ShellAuf vielen Linux-Systemen verbreitete Standard- oder Login-ShellGroße Verbreitung und umfangreiche Skriptkompatibilität
C ShellAn der Programmiersprache C orientierte SyntaxÄltere beziehungsweise spezielle UNIX- und Linux-UmgebungenAndere Syntax als Bourne-kompatible Shells
KornShellKornShell, häufig ksh genanntBesonders im UNIX-System-V-Umfeld verbreitetVerbindet interaktive Funktionen mit leistungsfähiger Skriptsyntax
ZshZ ShellModerne Alternative, häufig von fortgeschrittenen Benutzern eingesetztViele Anpassungs- und Komfortfunktionen
FishFriendly Interactive ShellModerne interaktive ShellBenutzerfreundliche Vervollständigung, aber nicht vollständig Bash-kompatibel

Ein Skript, das für Bash geschrieben wurde, muss deshalb nicht unverändert mit jeder anderen Shell funktionieren. Besonders bei der Automatisierung sollte die vorgesehene Shell angegeben oder verwendet werden.

Bash praktisch verwenden

Bash steht für „Bourne Again Shell“. Sie ist auf vielen Linux-Distributionen eine verbreitete Standard-Shell. Eine einfache interaktive Sitzung könnte so aussehen:

anna@linux-pc:~$ pwd
/home/anna
anna@linux-pc:~$ ls
Dokumente  Bilder  notizen.txt
anna@linux-pc:~$ cd Dokumente
anna@linux-pc:~/Dokumente$ cat notizen.txt
cat: notizen.txt: Datei oder Verzeichnis nicht gefunden
anna@linux-pc:~/Dokumente$ echo "Hallo Shell"
Hallo Shell

Die wichtigsten ersten Befehle:

BefehlZweckBeispiel
pwdZeigt das aktuelle Arbeitsverzeichnispwd
lsListet Dateien und Verzeichnisse aufls
cdWechselt das Arbeitsverzeichniscd Dokumente
catGibt den Inhalt einer Textdatei auscat notizen.txt
echoGibt Text oder den Wert einer Variablen ausecho "Hallo Shell"

cd verändert das Arbeitsverzeichnis der laufenden Shell. Deshalb beeinflusst ein späterer relativer Dateiname, in welchem Verzeichnis nach einer Datei gesucht wird. cat kann nur dann den erwarteten Inhalt anzeigen, wenn die Datei im angegebenen Pfad vorhanden und lesbar ist.

Interaktive Nutzung und Shell-Skripte

Bei der interaktiven Nutzung gibt ein Benutzer einen Befehl ein, erhält eine Rückmeldung und entscheidet anschließend über den nächsten Schritt. Ein Shell-Skript ist dagegen eine Textdatei mit mehreren Befehlen. Die Befehle können dadurch in einer festgelegten Reihenfolge und wiederholt ausgeführt werden.

#!/usr/bin/env bash
printf '%s\n' "Arbeitsverzeichnis:"
pwd
printf '%s\n' "Dateien:"
ls

Die erste Zeile legt fest, dass das Skript mit Bash ausgeführt werden soll. Skripte können Bedingungen, Schleifen und Variablen enthalten. Vor dem Einsatz auf wichtigen Dateien sollte ein Skript jedoch in einem sicheren Testverzeichnis geprüft werden.

Welche Shell ist aktiv?

Mit der Umgebungsvariablen SHELL lässt sich häufig die konfigurierte Login-Shell anzeigen:

echo "$SHELL"

Das Ergebnis beschreibt die für den Benutzer eingetragene Login-Shell, nicht zwingend jedes Detail der aktuell laufenden Prozesskette. Die aktuell laufende interaktive Shell kann in vielen Linux-Systemen beispielsweise so ermittelt werden:

ps -p $$ -o comm=

Welche Shells auf dem System registriert sind, zeigt häufig diese Datei:

cat /etc/shells

Die Datei kann fehlen oder je nach System anders verwaltet werden. Ihre Einträge sind eine Liste zulässiger Login-Shells, keine Garantie dafür, dass alle Shells gerade ausgeführt werden.

Shells außerhalb von Linux

Kommandozeilen-Shells gibt es auch auf anderen Betriebssystemen. Die Windows-Eingabeaufforderung ist ein Beispiel. Windows bietet außerdem weitere Kommandozeilenumgebungen mit jeweils eigener Syntax und eigenen Befehlen.

Das Grundprinzip ist ähnlich: Eine textbasierte Umgebung liest Befehle und startet Programme. Befehle sind jedoch nicht automatisch kompatibel. Ein Linux-Befehl wie ls oder die Syntax von Bash funktioniert nicht zwingend in der Windows-Eingabeaufforderung. Auch zwischen verschiedenen Linux-Shells können sich Skriptkonstruktionen unterscheiden.

Häufige Probleme beim Einstieg

„command not found“

Diese Meldung bedeutet, dass die Shell den Befehl nicht finden oder aufrufen konnte. Mögliche Ursachen sind ein Tippfehler, ein nicht installiertes Programm oder ein Verzeichnis, das nicht in PATH enthalten ist.

command -v befehl

Mit command -v lässt sich prüfen, ob die Shell einen Befehl findet. Schreibweise und Dokumentation sollten zuerst geprüft werden. Unbekannte Systempfade oder Konfigurationsdateien sollten nicht wahllos geändert werden.

Dateiname mit Leerzeichen

Die Shell trennt Argumente normalerweise an Leerzeichen. Ein Dateiname wie Meine Datei.txt wird deshalb ohne Schutz als zwei Argumente behandelt.

cat "Meine Datei.txt"
cat Meine\ Datei.txt

Anführungszeichen oder ein Backslash teilen der Shell mit, dass das Leerzeichen zum Dateinamen gehört.

„Permission denied“

Diese Meldung weist häufig auf fehlende Zugriffsrechte oder eine Datei hin, die nicht als ausführbar markiert ist. Die aktuellen Rechte lassen sich beispielsweise ansehen:

ls -l

Rechte sollten nur gezielt und mit verstandenem Zweck angepasst werden. Befehle mit administrativen Rechten können große Teile des Systems verändern. Sie sollten nicht verwendet werden, nur weil ein Fehler dadurch scheinbar verschwindet.

Eine andere Shell als Bash

Wenn eine andere Shell angezeigt wird als erwartet, kann eine abweichende Login-Shell konfiguriert sein. Möglich ist auch, dass Bash aus einer anderen Shell gestartet wurde oder umgekehrt. Prüfe zunächst die konfigurierte Shell mit echo "$SHELL" und die laufende Shell mit ps -p $$ -o comm=. Ein Wechsel sollte erst erfolgen, wenn die Auswirkungen auf Konfigurationen und Skripte verstanden sind.

Sicherer Einstieg in die Kommandozeile

Shell-Befehle sind präzise und können unmittelbar wirken. Ein Tippfehler kann deshalb eine andere Datei oder ein anderes Verzeichnis betreffen als beabsichtigt. Besonders vorsichtig solltest du bei Befehlen sein, die Dateien löschen, Inhalte überschreiben oder administrative Rechte verwenden.

  • Übe zunächst in einem eigenen Testverzeichnis mit unwichtigen Dateien.
  • Lies bei unbekannten Befehlen die Dokumentation, beispielsweise mit man befehl oder der integrierten Hilfe des Programms.
  • Prüfe Pfade, Optionen und Ziele vor dem Ausführen.
  • Verwende administrative Rechte nur, wenn sie wirklich erforderlich sind.
  • Teste Skripte zuerst mit ungefährlichen Beispieldateien.

Das Wichtigste zusammengefasst

  • Eine Shell ist eine textbasierte Benutzerschnittstelle und ein Befehlsinterpreter.
  • Sie liest Benutzereingaben, interpretiert sie und startet Programme oder löst Systemaktionen aus.
  • Ein Terminal oder Terminalemulator stellt den Zugang zu einer Shell bereit.
  • Der Kernel verwaltet die grundlegenden Ressourcen des Betriebssystems und steht hinter den von Programmen angeforderten Systemaktionen.
  • Bash ist eine verbreitete Linux-Shell; Zsh, Fish, C Shell und KornShell sind weitere Beispiele.
  • Shells eignen sich für Navigation, Dateiverwaltung, Administration, Fehlersuche und Automatisierung.
  • Befehle, Optionen und Argumente müssen korrekt eingegeben werden, insbesondere bei Lösch- und Administrationsbefehlen.

Für den nächsten Schritt eignet sich die Einführung in die Linux-Shell als Ausgangspunkt für Themen wie grundlegende Befehle, Dateirechte, Umgebungsvariablen und Bash-Skripting.