Linux/Shell/Grundlagen

Aus Foxwiki

Was ist eine Shell?

  • Das UNIX Shell Programm interpretiert Benutzerkommandos, die entweder direkt durch den Benutzer eingegeben oder aus einer Datei, dem Shellscript, gelesen werden.
  • Shellskripte werden interpretiert nicht kompiliert. Die Shell liest Zeile für Zeile und such nach solchen Befehlen auf dem System, während ein Compiler ein Programm in ein maschinenlesbares Format, eine ausführbare Datei, die dann in einem Shellscript genutzt werden kann.
  • Neben der Übermittlung von Kommandos an den Kernel ist die Hauptaufgabe einer Shell dem Benutzer eine Arbeitsumgebung zu stellen, die sich durch Konfigurationsdateien individuell konfigurieren lässt.

Allgemeine Shell-Funktionen

  • Die Shell ist die Eingabe-Schnittstelle zwischen Computer und Benutzer, welche bei normaler Systemkonfiguration nach dem erfolgreichen Login eines Benutzers gestartet wird, so dass man auf dieser Kommandozeile die Möglichkeit hat weitere Programme zu starten.
  • Die Shell könnte man somit aus Arbeitsumgebung bezeichnen, von wo aus der PC gesteuert werden kann bzw. Dateien bearbeitet werden können.
  • Es gibt unterschiedliche Arten von Shell’s, wer ein modernes Linux-Betriebssystem (Debian, Ubuntu…) installiert, landet meistens in der sogenannten “bash“, darauf gehe ich jedoch gleich genauer ein.
  • Die eingegebenen Texteingaben werden von der Shell interpretiert und ausgeführt, daher spricht man bei der Shell auch von einem Kommandozeileninterpreter (command-line interpreter, CLI).

Aufgaben einer Shell

  • In einem klassischen Unix-System (ohne grafische Oberfläche) greifen die Benutzer über Terminals auf das System zu. Auf diesen Terminals können nur Textzeichen dargestellt werden. Um dem Benutzer die Arbeit mit dem System effektiv möglich zu machen, gibt es die Shell. Die Shell wird dabei für drei Hauptaufgaben benutzt:* Interaktive Anwendung (Dialog)
    • Anwendungsspezifische Anpassung des Unix-Systemverhaltens (Belegen von Umgebungsvariablen)
    • Programmierung (Shell Scripting). Zu diesem Zweck stehen einige Mechanismen zur Verfügung, die aus Hochsprachen bekannt sind (Variablen, Datenströme, Funktionen usw.).
  • Ursprünglich handelte es sich dabei um ein relativ einfaches Programm, der Bourne Shell (wird oft auch Standard-Shell genannt).
  • Dies ist praktisch die Mutter aller Shells. Aus dieser entwickelten sich im Laufe der Zeit mehrere Varianten, die alle ihre eigenen Vor- und Nachteile mit sich bringen.
  • Da es unter Unix kein Problem darstellt den Kommandointerpreter auszutauschen, stehen auf den meisten Systemen mehrere dieser Shells zur Verfügung.

Vermittler zwischen Benutzer und Betriebssystem-Kern

  • Weil die direkte Kommunikation mit dem Betriebssystem-Kern für einen Benutzer viel zu komplex wäre, ist eine vereinfachte Benutzer-Schnittstelle erforderlich. Neben einer grafischen Schnittstelle wie dem X Window System wird diese Leistung vor allem von einer Shell bereitgestellt.

Datei:Grafik18.png

  • Der englische Ausdruck Shell, zu Deutsch etwa Schale oder Ummantlung, drückt diesen Sachverhalt bereits aus. Die Übersetzung oder Symbolisierung als Muschel hat dabei wohl mehr mit Spieltrieb und Anschaulichkeit als mit einem echten technischen Hintergrund zu tun.
  • Jedenfalls lässt sich eine Shell als eine Schicht zwischen Betriebssystem und Benutzer verstehen. Wir veranschaulichen dies in der folgenden Grafik:
  • Während Benutzer, die noch nicht häufig mit Shells in Berührung gekommen sind, den wartenden Eingabe-Prompt einer Shell als trist und abweisend, ja sogar als Hindernis empfinden mögen, wurden Shells doch mit der gegenteiligen Absicht entwickelt:
  • Sie sollten die tägliche Arbeit vereinfachen und erleichtern.

Interpretation der Kommandozeile

  • Die Hauptaufgabe einer Shell besteht darin, Kommandos entgegenzunehmen und das Betriebssystem um ihre Ausführung zu bitten. Das klingt einfach, stößt aber in der Praxis auf besondere Probleme und Anforderungen. Eine Shell hat daher zunächst eine Interpretation der Kommandozeile zu leisten.
  • Sie interpretiert einzelne Zeichen oder Worte der Eingabe und ersetzt sie ggf. durch neue Zeichen oder Worte. So stehen beispielsweise Variablen für bestimmte Zeichenketten und werden zunächst von der Shell durch ihren Inhalt ersetzt, bevor der Aufruf eines Kommando erfolgt.
  • Das gleiche gilt für Platzhalterzeichen wie * oder ?, die für die Angabe von Zeichenmustern verwendet werden können. Diese und zahlreiche weitere Mechanismen kann der Benutzer verwenden, um seine Kommandozeilen knapper und effektiver zu formulieren.

Kombination von Kommandos

  • Häufig ist es auch nicht nur ein einzelnes Kommando, das ausgeführt werden soll. Kommandos können beispielsweise so miteinander verbunden werden, dass die Ausgabe eines Kommandos zur Eingabe eines weiteren Kommandos wird.
  • Auch wiederholte oder bedingte Ausführungen in Form von Schleifen und wenn-dann-Konstrukten sind wünschenswert und werden daher von vielen Shells ermöglicht.
  • Schließlich möchte man häufig eine bestimmte wiederkehrende Folge von Kommandos ausführen lassen, die man daher in einer Datei niederschreibt und für die spätere Ausführung abspeichert.
  • Die Konfiguration eines Linux-Systems erfolgt häufig über solche Dateien, die als Shell-Skripte bezeichnet werden.

Bereitstellung einer persönlichen Arbeitsumgebung

  • Bei der täglichen Arbeit ist des weiteren die Konfiguration einer typischen Arbeitsumgebung von Bedeutung.
  • So möchte ein Benutzer beispielsweise meist mit einer passenden Spracheinstellung arbeiten, seinen Lieblingseditor zum Editieren von Texten verwenden, verwendeten Programmen Information über seine Vorlieben mitteilen, die Form seines Eingabe-Prompts ändern und vieles andere.
  • All dies lässt sich über sogenannte Shellvariablen konfigurieren, auf Wunsch auch dauerhaft in einer Konfigurationsdatei, damit die Einstellungen nicht bei jeder Anmeldung wiederholt werden müssen.
  • Eine Shell bietet ihrem Benutzer somit eine konfigurierbare, persönliche Umgebung, um typische Arbeitsabläufe möglichst komfortabel und fehlerfrei abwickeln zu können.

Begriffe

Konsole

In ihrer ursprünglichen Definition war die Konsole ein Terminal, mit dem der Systemoperator die Systemfunktionen steuern konnte. Heute wird der Begriff ebenfalls für “Terminalemulation” verwendet.

Terminal

Ein Terminal ist ein Computer, der den Zugriff auf einen entfernten Rechner erhält und die meisten Rechenoperationen somit nicht selber durchführt. (Terminal-PCs) Der Begriff “Terminal” wird heute jedoch auch als Abkürzung für “Terminalemulation” verwendet.

Terminalemulation

Mit einer Terminalemulation wird eine textorientierte Ein- und Ausgabeschnittstelle, ein Terminal emuliert, so dass man mehrere Instanzen eines Terminals auf dem Desktop zur Verfügung hat.

Virtuelle Konsole

Die meisten Linux-Systeme kommen standardmäßig mit einigen virtuellen Konsolen daher, welche man über [Strg] + [Alt] + [F1] bis [F6] erreichen kann. Mittels [Strg] + [Alt] + [F7] wird der Desktop und somit die graphischen Oberfläche wieder angezeigt.

Zugang zur Shell

Virtuelle Konsolen (tty) werden per Tastenkombination aufgerufen. Die Abkürzung tty stammt von dem englischen Wort Teletype und wurde historisch bedingt von Unix übernommen.

[Strg] + [Alt] + [F1]

… gelangt man in die erste der tty-Konsolen, in diesem Fall tty1. Hat man eine grafische Oberfläche (Desktop) installiert, so befindet sich dieser standardmäßig auf tty7.

  • Dieser Wert ist jedoch Variabel und kann umverlegt werden. Wer die Maus in einer solchen virtuellen Konsole verwenden will, sollte sich das Programm “gpm” anschauen / installieren.
  • Hat man sich einmal an die Desktop-Oberfläche gewöhnt, erscheinen einem diese virtuelle Konsolen meist wenig komfortabel, daher gibt es einige Programme (Terminalemulation) welche den Funktionsumfang erheblich erweitern.
  • Wenn man seine Standard-Terminal ändern möchte, kann man dies mit dem Alternativen-System bewerkstelligen… sudo update-alternatives --config x-terminal-emulator

KDE – Konsole

  • Das Programm unterstützt Tabs, Transparenz, verschiedenste Farbschema, unterschiedliche Schriften und man kann Profile anlegen.

Datei:Grafik20.png

Gnome – Terminal

  • Gnome-Nutzer verfügen über ein Programm mit dem Namen “Gnome-Terminal”.
  • Wer das Terminal immer Griffbereit haben möchte, sollte sich einmal “guake” anschauen…

Datei:Grafik31.png

Xterm

  • Xterm ist Bestandteil des X.org Projekts und war lange Zeit das Standardterminal für Linuxsysteme mit grafischer Oberfläche.

Datei:Grafik28.png

CLI Companion

  • Wer die Linux-Befehle noch lernen möchte oder komplizierte Befehle öfter benötigt, kann sich auch dieses Terminal anschauen.

Datei:Grafik23.png

Terminator

  • Terminator ist ein in Python geschriebener Terminal-Emulator für die Desktop-Umgebung GNOME, der es ermöglicht mehrere Terminals innerhalb eines Fensters bzw. einzelner Tabs zu benutzen und mittels Tastatur-Kürzeln zwischen diesen zu wechseln.
  • So kann man ohne Tabs und ohne weitere Terminalfenster mehrere Shells zur selben Zeit offen haben.”

Datei:Grafik33.png

  1. http://wiki.ubuntuusers.de/Terminator http://wiki.ubuntuusers.de/Terminator

Shell-Programme

Verfügbare Shells

  • So wie es verschiedene Programmierapachen und UNIX-Dialekte gibt, bietet ein UNIX-System üblicherweise verschieden Shells an.
  • Die Datei /etc/shells gibt einen Überblick über die bekannten Shells auf einem Linux-System:
cat /etc/shells
/bin/bash
/bin/sh
...
  • Die Standshell, ist in der Datei /etc/passwd festgelegt, wie beispielsweise die Zeile für den Benutzer dirkwagner:
dirkwagner:x:1000:100:Dirk Wagner:/home/dirkwagner:/bin/bash

Aufruf einer Shell

  • Eine Shell kann, wie jedes andere Programm, durch Aufruf seines Namens gestartet werden. Dabei werden alle Shells gefunen, die in der Path-Vsiable des angemdeten Benutzers enthalten sind.
  • Das System findet das Verzeichnis mit der passenden Programm über die PATH -Variable und da eine Shell ein normales Programm ist, wird es aufgerufen und ausgeführt.
  • Normalerweise wird ein neuer prompt angezeigt, da jede Shell Ihr eigenes Aussehen hat.
tcsh
$

Z-Shell starten

zsh

Wechsel der Standardshell

Standardmäßig die Z-Shell verwenden

sudo chsh -s /usr/bin/zsh `whoami`

Einfach- und Komfort-Shells

  • Komfort-Shells zeichnen sich durch komfortablere Funktionen zur interaktiven Bedienung aus, während die Einfach-Versionen üblicherweise für die Programmierung benutzt werden. Eine Shell kann wie jede andere Anwendung durch eine andere Shell ersetzt bzw. ausgetauscht werden.
  • Welche Shell der Anwender auch verwendet, jede Shell hat denselben Ursprung, die Mutter (oder auch der Vater) aller Shells ist die Bourne-Shell (sh), welche von S. R. Bourne 1978 entwickelt wurde und sich gleich als Standard-Shell im UNIX-Bereich durchgesetzt hat.
  • Einige Zeit später wurde für das Berkeley-UNIX-System eine weitere Shell namens C-Shell (csh) entwickelt, die erheblich mehr Komfort als die Bourne-Shell bot. Leider war die C-Shell bezüglich der Syntax gänzlich inkompatibel zur Bourne-Shell und glich mehr der Syntax der Programmiersprache C.
  • An diese beiden Shell-Varianten, der Bourne-Shell und der C-Shell, lehnten sich alle weiteren Shells an. Aus der Sparte der Bourne-Shell gingen als etwas bekanntere Vertreter die Shell-Varianten ksh (Korn-Shell), bash (Bourne-Again-Shell), zsh (Z-Shell), ash (A-Shell) und rbash bzw. rzsh (Restricted Shell) hervor. Aus der C-Shell-Abteilung hingegen trat nur noch tcsh (TC-Shell) als eine Erweiterung von csh in Erscheinung.
  • Die Bourne-Shell (sh) gibt es auf einem Linux-System eigentlich nicht und wird dort meistens vollständig von der bash (Bourne-Again-Shell) ersetzt. Wenn Sie also unter Linux die Bourne-Shell starten, führt dieser Aufruf direkt (als symbolischer Link) zur bash.
Einfache Shells
Bourne- / Standard-Shell (sh)
  • Kompakteste und einfachste Form
  • Mechanismen
    • Umlenkung der Ein- oder Ausgaben
    • Wildcards zur Abkürzung von Dateinamen
    • Shell-Variablen
    • Einen Satz interner Befehle zum Schreiben von Shell-Prozeduren
    • Neuere Versionen beherrschen auch das Job-Controlling
  • Kleinster gemeinsamer Nenner aller Shells
    • Für die Entwicklung von Shell-Skripten sollte man sich auf diese Shell beschränken, da sie auf praktisch allen Systemen zur Verfügung steht. So bleiben die Skripte portabel.
ksh (Korn-Shell)
  • Weiterentwicklung der Bourne-Shell
  • Hier wurden gegenüber der Bourne-Shell besonders interaktive Merkmale und auch einige Funktionalitäten der C-Shell hinzugefügt.
    • Editieren in der Befehlszeile
    • History-Funktionen
    • Ganzzahl-Arithmetik
    • Verbesserte Möglichkeiten zur Mustererkennung
    • Aliase
    • Job-Controlling
  • Die Korn-Shell ist seit UNIX.4 Bestandteil eines Standard-UNIX-Systems und gewöhnlich auch die Standard-Shell in der UNIX-Welt.
  • Wie auch bei der Bourne-Shell, wird der Aufruf unter Linux durch die Bash ersetzt.
  • Für den Fall der Fälle gibt es für Linux allerdings auch eine Version der Korn-Shell, eine Public Domain Korn-Shell (pdksh), welche den meisten Distributionen beiliegt.
C-Shell (csh)
  • Bietet ähnliche Annehmlichkeiten wie die Korn-Shell
  • Lehnt sich aber in der Syntax sehr stark an die Programmiersprache C an
  • Sollte nicht zur Shell-Programmierung benutzt werden, da sie an vielen Stellen nicht so reagiert, wie man es erwarten sollte
Komfort-Shells
Bourne-Again-Shell (bash)
  • Die Bash ist praktisch die Standard-Shell in der Linux-Welt und mittlerweile generell die am meisten benutzte Shell. Sie ist im Prinzip eine freie Nach-Implementierung der Bourne- und der Korn-Shell.* Ist voll abwärtskompatibel zur sh
  • Bietet von allen Shells die komfortabelsten Funktionen für das interaktive Arbeiten
  • Standard-Shell auf allen Linux-Systemen
  • Steht für die meisten anderen Unixen zur Verfügung
tcsh (TC-Shell)
  • Hierbei handelt es sich lediglich um eine verbesserte und ein wenig erweiterte Version der C-Shell (csh) mit voller Kompatibilität zu dieser.
  • Erweitert wurden allerdings nur die automatische Eingabevervollständigung, wie sie beim Betriebssystem »TENEX« (daher auch TC-Shell = TENEX C-Shell) anzutreffen war. TENEX ist allerdings wie die Dinosaurier bereits ausgestorben.* Verhält sich zur C-Shell wie die Bourne-Again-Shell zur Standard-Shell
  • Sie ist voll kompatibel, bietet aber zusätzliche Komfort-Funktionen
zsh (Z-Shell)
  • Die Z-Shell ist eine Erweiterung der Bourne-Shell, Korn-Shell und der Bash.
  • Die Zsh kann man als eine Zusammenstellung aller Verbesserungen und Features aus der bash, der csh und der tcsh betrachten.
  • Eine Shell mit derartiger Funktionalität müsste sich doch zu einer Art Standard-Shell etablieren!?
  • Dass dies nicht so ist und wahrscheinlich auch nie so sein wird, liegt wohl an der mangelnden Übersichtlichkeit ihrer Funktionalität.
  • Es stellt sich die Frage nach dem Sinn einer solchen Shell.

Features

  • eine frei programmierbare Wortvervollständigung (TAB-Completion)
  • die Möglichkeit, die History aus anderen – gleichzeitig laufenden – Shells zu nutzen
  • Rechtschreibüberprüfung
  • nahezu vollständige Kompatibilität zur bash, ksh und tcsh

Bei der Z-Shell kann hat man noch viel mehr Einstellungsmöglichkeiten, welche einem Anfangs ggf. überfordern können, daher auch hier meine “.zshrc“-Datei als Vorlage. -> zshrc

ash (A-Shell)
  • Bei der A-Shell handelt es sich um eine ähnliche Shell wie die Bourne-Shell, allerdings mit einigen Erweiterungen.
  • Die A-Shell gehört eher zu einer exotischeren Spezies und gilt auch nicht als sonderlich komfortabel.
  • Dass ich sie dennoch erwähne, liegt an der geringen Größe an Speicherplatz (60 KB), die sie benötigt (auch wenn dies heutzutage kein Thema mehr ist).
  • Dank dieser geringen Größe kann die ash überall dort verwendet werden, wo an Speicherplatz gespart werden muss.
  • Dies kann bspw. die Erstellung einer Notfall-Diskette sein, mit der man sein Linux-UNIX-System booten will.
  • Oder man ist auf der Suche nach einer Shell, die man in die Start-RAM-Disk beim initrd-Verfahren laden will.
  • Selbst in einer ziemlich abgeriegelten Umgebung (bspw. mit chroot) kommt man im lokalen Zugriffsmodus mit der ash sehr weit.
  • Ist darauf optimiert, dass möglichst viele externe Kommandos durch die internen Funktionen der Shell ersetzt werden.
  • Dadurch ist das System auch dann bedienbar, wenn wesentliche externe Programme fehlen
  • Ist vor allem nützlich für die System-Recovery
rbash, rzsh (Restricted Shell)
  • Hierbei handelt es sich um »erweiterte« Shell-Varianten der Bash bzw. der zsh.
  • Die Erweiterung bezieht sich allerdings hier nicht auf den Funktionsumfang, sondern eher auf gewisse Einschränkungen des Benutzers in seinen Rechten und Möglichkeiten.
  • Diese Einschränkungen können vom Systemadministrator für jeden Benutzer spezifisch gesetzt werden. Dies ist besonders bei fremden Zugriffen von außen recht sinnvoll.
rsh und ssh

Obwohl rsh (Remote Shell) und ssh (Secure Shell) keine Shells wie bspw. die Korn-Shell bzw. die Bash sind, sollen diese hier trotzdem kurz erwähnt werden, weil es gern und häufig zu Missverständnissen bei Anfängern führt. * Hierbei handelt es sich nicht – wie bei den eben vorgestellten Shells – um eine Benutzerschnittstelle zum System.

  • Beide Kommandos werden dazu verwendet, auf einem anderen System (etwa Ihrem Webhoster) übliche Shell-Kommandos (remote) auszuführen.
  • Die ssh ist der Sicherheit zuliebe der rsh vorzuziehen, da die ssh z. B. ein erweitertes Authentifizierungsverfahren benutzt und die Passwörter vom Login sowie die komplette Datenübertragung verschlüsselt.
  • Dadurch ist ein Abhorchen der Daten nicht möglich.

Verbreitung der Shells

Es gibt zwei Linien der Shell-Programmierung – die Bourne-Shell- und die C-Shell-Familie. In der heutigen Shell-Welt wird vorzugsweise die Bourne-Shell-Familie verwendet, genauer: *

    • UNIX die Korn-Shell als Standard-Shell
    • Linux benutzt die Bash als Standard-Shell
    • Bei FreeBSD hingegen scheiden sich häufig die Geister
      • für Anwender sh
      • für Superuser häufig die csh als Standard gesetzt

Die C-Shell-Familie verliert allerdings aufgrund einiger Schwächen (bspw. fehlen einige wichtige Programmier-Konstrukte) immer mehr an Boden gegenüber der Bourne-Familie.

  • Somit arbeiten wir im weiteren mit der Bash und gehen auf einige Besonderheiten der Bourne- Shell ein, weil die viele Boot-Scripts (init-Scripts) mit ihr erstellt werden.
  • Die Korn-Shell, weil diese quasi die Standard-Shell unter UNIX ist und immer noch unzählige Scripts hierfür geschrieben werden.

Die Bash ist die Standard-Shell unter Linux und betrifft damit die meisten Benutzer.

Die Unterschiede dieser drei Shells nicht sehr groß, wenn es also einen besonderen Unterschied zwischen dieser oder jener Shell gibt, so wird darauf hingewiesen.