Zum Hauptinhalt springen

Terminal-Grundlagen

Für diese Veranstaltung ist es notwendig, dass Sie grundlegend mit der text-basierten Benutzerschnittstelle Ihres Betriebssystems, dem Terminal, umgehen können. In diese Kommandozeilen-Schnittstelle (command line interface, CLI) gibt man Befehle in Textform ein. CLIs haben also im Gegensatz zu grafischen Benutzerschnittstellen (graphical user interfaces, GUIs) (meistens) keine Buttons oder Menüs, die man anklicken kann.

In dieser Vorlesung brauchen wir nur ein paar wenige grundlegende Befehle, die sie schnell erlernen werden. – Die volle Macht des Terminals werden Sie dadurch aber noch nicht kennenlernen.

Begrifflichkeiten

Wir erklären nun einige wichtige Vokabeln und Befehle rund um das Terminal. Wir werden die Vokabeln nicht explizit in der Klausur abfragen, aber es ist wichtig, dass Sie ein gewisses Grundverständnis für die Begrifflichkeiten haben, damit wir problemlos miteinander kommunizieren können. Die Vokabeln sollten also im Laufe des Semester zumindest Teil ihres passiven Wortschatzes werden.

Die Begriffe Terminal, Konsole, Shell und Kommandozeile werden meistens synonym gebraucht; es gibt kleine Unterschiede, aber diese sind für die Programmierung an den meisten Stellen uninteressant.

In das Terminal gibt man Befehle ein. Ein Befehl beginnt mit dem Namen des Programms, das man ausführen möchte. ls ist zum Beispiel ein Programm, das auflisten kann, welche Dateien im aktuellen Ordner (oder: Verzeichnis, folder, directory) sind.

Befehle können auch Argumente (oder: Optionen, Parameter) entgegennehmen, die mit Leerzeichen getrennt werden. ls -l Vorkurs-Beispiel bewirkt zum Beispiel, dass ls die Dateien im Ordner „Vorkurs-Beispiel“ in einem langen (ausführlichen) Listen-Format ausgibt. Falls ein Argument selbst Leerzeichen enthält, setzt man es in Anführungszeichen: ls "Programmierung 2021" hat also ein Argument.

Wenn das Terminal bereit ist, Befehle entgegenzunehmen, sehen Sie eine sogenannte Eingabeaufforderung (Prompt). Diese gibt typischerweise an, in welchem Verzeichnis das Terminal gerade ist (Arbeitsverzeichnis, working directory) und endet meistens mit $, % oder >. Das Zeichen ~ ist unter Unix-artigen Systemen (Linux, macOS) eine Abkürzung für das eigene Benutzerverzeichnis (z. B. /home/knut oder C:\Users\Knut).

Das folgende Bild fasst die Begriffe zusammen:

Die im Text beschriebenen Begriffe in einem Terminal gekennzeichnet

Ich möchte es doch genauer wissen …

Sie wollen also doch wissen, was Terminal und Shell unterscheidet. Es freut uns, dass Sie neugierig sind. (Sie müssen das hier aber alles nicht für die Klausur wissen.)

Eine (Text-)Shell ist ein Programm, das die Eingabeaufforderung anzeigt und die Befehle, die wir eintippen, entgegennimmt und interpretiert. Beispielsweise ist die Shell dafür zuständig, herauszufinden wo die Programme sind, die aufgerufen werden (dafür wird die sogannte PATH-Umgebungsvariable benutzt), den aufgerufenen Programmen ihre Argumente zu übergeben, Standardein- und -ausgabe umzuleiten oder Befehlsverknüpfungen mit && zu verarbeiten. Es gibt verschiedene Shells, z. B. bash, cmd, PowerShell und Z shell.

Der Begriff Shell kommt daher, dass sie eine Schnittstelle zum Betriebssystem-Kern (Kernel) ist. Shellscripte sind eine Abfolge von Shell-Befehlen, mit denen Aufgaben automatisiert werden können; diese Scripte können auch Verzweigungen und Schleifen enthalten. Grafische Desktopumgebungen wie KDE Plasma und die Gnome Shell werden auch als grafische Shells bezeichnet.

Ein Terminalemulator ist ein Programm, in dem eine (Text-)Shell ausgeführt wird und sie in einer grafischen Oberfläche zur Verfügung stellt. Es wird z. B. ein Fenster mit Menüs angezeigt oder Tabs mit verschiedenen Shells. Beispiele sind GNOME Terminal, KDE Konsole, Terminal (macOS), Windows Terminal und xterm (ja, die Benennung dieser Programme macht das mit den Begrifflichkeiten nicht einfacher).

Ein Terminal (oder Konsole) ist ein Gerät, um Daten von einem Computer anzuzeigen und Daten einzugeben. Die eigentliche Berechnungen finden also nicht im Terminal statt, sondern in einem verbundenen Computer. Da es heutzutage so gut wie keine echten Terminals mehr gibt, meint man mit Terminal in der Regel einen Terminalemulator. (Video zur Geschichte von Terminals)

Befehle sind Programme (z. B. ist file unter Linux ein Programm im Verzeichnis /usr/bin/) oder in die Shell integriert (z. B. cd). Der Befehl which kann einem sagen, ob ein Befehl ein Programm oder Built-in ist (probieren Sie das z. B. mal mit which cd aus).

Optionen ändern das Verhalten eines Befehls und existieren typischerweise in einer Kurzform (beginnend mit -, z. B. -a) und einer Langform (beginnend mit --, z. B. --all); in der Windows-Welt wird / statt - verwendet. Bei der Programmierung eines Programms wird i. d. R. festgelegt, welche Optionen das Programm versteht.

Ein Parameter ist eine zusätzliche Information für einen Befehl oder eine Option, z. B. ein Dateiname, und hat typischerweise einen nicht schon bei der Programmierung des Befehls festgelegten Wert.

Argument ist ein Oberbegriff für Parameter und Optionen. In der Praxis werden diese Begriffe aber nicht strikt unterschieden.

Für uns wichtige Befehle

BefehlsnameBedeutungBeispiel
cdWechselt das Verzeichnis, in dem sich das Terminal befindetcd Dokumente/Programmierung
lsZeigt Dateien im aktuellen Verzeichnis anls

Leerzeichen sind böse

Leerzeichen in Ordner- und Dateinamen sind etwas tricky: Angenommen, ich möchte in das Verzeichnis mit dem Namen Projekt 1 wechseln. Warum wird das (in den meisten Terminals) nicht mit mit cd Projekt 1 funktionieren?

Das Terminal kann aber dafür sorgen, dass der Befehl cd nur ein Argument Projekt 1 sieht, dazu haben wir folgende Möglichkeiten:

  • Wir setzen das Argument in Anführungszeichen: cd "Projekt 1". Unser Terminal erkennt das und übergibt nur ein Argument Projekt 1 (ohne Anführungszeichen) an cd.
  • Wir heben die besondere Bedeutung des Leerzeichens auf (sog. Escaping): cd Projekt\ 1. Unser Terminal erkennt dieses Escaping und übergibt nur ein Argument Projekt 1 (ohne den Backslash) an cd.

Dieser Trick funktioniert übrigens nicht nur mit cd, sondern gilt für alle Konsolen-Befehle. Das Terminal kümmert sich nämlich um die besondere Interpretation von " und \; das aufgerufene Programm bekommt gar nicht mit, was wir da getan haben.

Tipps zur Bedienung

Um schneller mit dem Terminal arbeiten zu können, sollten Sie sich – ähnlich wie beim Texteditor – einmal mit typischen Tastenkürzeln vertraut machen. Je nach Terminal und Betriebssystem kann es leichte Abweichungen geben.

FunktionLinuxmacOSWindows (PowerShell)
Befehl/Dateiname vervollständigen↹ Tabulator-Taste
vorher eingetippte Befehle durchblättern↑ Pfeil-nach-oben-Taste
in bereits eingetippten Befehlen suchen
(reverse-search-history)
Strg+R
aktuell laufendes Programm beenden
(kann vom Programm verhindert werden)
Strg+C
Standard-Eingabe beenden (End-of-File)Strg+DStrg+Z, Enter
markierten Text in Zwischenablage kopierenStrg+Umschalt+C⌘+CStrg+C
Inhalt der Zwischenablage einfügenStrg+Umschalt+V⌘+VStrg+V/
Rechtsklick
zuletzt markierten Text einfügenmittlere Maustaste/
mit Mausrad klicken
Aufgabe

Probieren Sie einmal aus, was Sie gerade gelesen haben:

  1. Schreiben Sie ein Hello-World-Programm. Bauen Sie mal absichtlich einen Fehler ein, z. B. eine fehlende Klammer. Speichern Sie die java-Datei.
  2. Öffnen Sie ein Terminal und wechseln Sie mit cd in das richtige Verzeichnis. Tippen Sie die Ordner-Namen nicht selbst aus, sondern lassen Sie sie mit der Tabulator-Taste vervollständigen.
  3. Prüfen Sie mit ls, dass sich in dem aktuellen Verzeichnis Ihre java-Datei befindet.
  4. Führen Sie java Hello.java aus. (Den Dateinamen müssen Sie ggf. an Ihre Wahl anpassen.) Wenn Sie einen Fehler eingebaut haben, sollte eine Fehlermeldung erscheinen.
  5. Versuchen Sie, die Fehlermeldung nachzuvollziehen, und korrigieren Sie den Fehler. (Speichern nicht vergessen.)
  6. Kompilieren Sie das Programm erneut. Drücken Sie im Terminal die Pfeil-nach-oben-Taste, damit Sie den Befehl nicht nochmal eintippen müssen.
Warum sollte ich mich als Informatiker:in mit dem Terminal auskennen?

Im späteren Beruf wird es relativ wahrscheinlich vorkommen, dass Sie Systeme ohne grafische Oberfläche bedienen können müssen. Das kann das Administrieren von Web-Servern, das Schreiben von Scripten für das automatische Testen von Softwareprojekten in CI-Umgebungen oder Job-Scripte für High-Performance-Cluster betreffen. Daher ist es vorteilhaft, sich jetzt schon ein wenig an die Arbeit mit einem CLI zu gewöhnen.

Außerdem sind die text-basierten Oberflächen quasi die Eltern der grafischen Oberflächen. Daher gibt es viel mehr Möglichkeiten, text-basiert bestimmte (vor allem System-nahe) Aufgaben zu erledigen als über grafische Oberflächen, weil z. B. noch niemand eine grafische Oberfläche für eine bestimmte Aufgabe entwickelt hat. Beispielsweise kann man beim Betriebssystem Ubuntu mit dem Befehl apt upgrade -d alle Software-Updates herunterladen, ohne sie sofort zu installieren; für diese Aktion gibt es keinen Button in der grafischen Softwareverwaltung.

Die Konsole ist mächtiger, aber der Umgang mit ihr auch schwieriger zu erlernen (und man kann auch einfacher mehr kaputt machen), da es kein Menü o. ä. gibt, wo alle vorhandene Möglichkeiten aufgezählt sind. Sobald man aber den Umgang mit Terminal-Befehlen beherrscht, kann man viele (wenn nicht sogar alle) Aufgaben mit sogenannten Shell-Scripten (einer abgespeicherten Abfolge von Terminal-Befehlen) automatisieren (z. B. eine Liste von Videos herunterladen und in Audio-Dateien umwandeln, oder alle Lösungsvorschläge zu Übungsblatt 1 automatisch zusammensuchen und in eine zip-Datei packen). Markus kann schneller über das Terminal zwischen häufig genutzten Ordnern hin- und herspringen und bestimmte Dateien finden, als er es durch Anklicken von Buttons im Dateimanager könnte. Das Ganze erfordert aber zugegeben einiges an Eingewöhnungszeit.

After all, can’t you do everything equally well by pointing and clicking? The simple answer is “no.”

— Topic 17: Shell Games, The Pragmatic Programmer: your journey to mastery, 20th Anniversary Edition, 2nd Edition (konstenlos lesbar im Uninetz)