Was ist Shell?

Ein Programm, das die vom Benutzer eingegebenen Befehle einliest und interpretiert, Programme startet und Ergebnisse anzeigt. Unter Linux sind bash und zsh verbreitet. Es bietet die Expansion von Wildcards, Variablen, Umleitungen und Pipes sowie Jobsteuerung und kann auch Dateien mit Befehlsfolgen (Shell-Skripte) ausführen, um Arbeit zu automatisieren. Der Name rührt daher, dass es als „Schale“ (englisch shell) um den Kernel, den Kern des Betriebssystems, zwischen diesem und dem Benutzer steht.

Japanische Bezeichnung: シェル

„Shell“ kommt in 11 Übungsfragen aus 2 Themen vor, z. B. Grundlagen von Linux und der Kommandozeile, Linker, Loader und ausführbare Formate.

Fachgebiet: Grundlagen von Linux und der Kommandozeile

Bis ein Befehl ausgeführt wird

Die Shell liest eine eingegebene Zeile, setzt für jede Variable ihren Wert ein, expandiert Wildcards (Globbing) und verarbeitet Anführungszeichen; danach zerlegt sie die Zeile in den Befehlsnamen und jeweils ein Argument pro Wort. Enthält der Befehlsname keinen Schrägstrich, führt sie entweder einen eingebauten Befehl aus oder startet die erste ausführbare Datei, die sie beim Durchsuchen der Verzeichnisse in der Umgebungsvariable PATH der Reihe nach findet. Auch das Umverbinden von Standardeingabe, Standardausgabe und Standardfehlerausgabe gemäß Umleitungen und Pipes ist Aufgabe der Shell.

Shell-Skripte

Steht in der ersten Zeile einer Datei mit Befehlen ein Shebang wie #!/bin/bash und erhält sie das Ausführungsrecht, lässt sie sich wie ein Programm ausführen. Das erste Argument wird mit $1 angesprochen, das zweite mit $2, ihre Anzahl mit $# und der Exit-Status des vorherigen Befehls mit $?; mit if, for und while lassen sich Verzweigungen und Schleifen schreiben. Solche Skripte automatisieren oft feste Abläufe, etwa das Stapelausführen von Simulationen oder das Auswerten von Logs.

Verschiedene Shells

Neben bash, das unter Linux weit verbreitet ist, gibt es zsh und fish mit umfangreichen interaktiven Funktionen sowie dash, das schlank ist und schnell startet. Skripte, die nur die im POSIX-Standard festgelegte sh-Syntax verwenden, laufen in vielen Shells. Skripte zur Umgebungseinrichtung von EDA-Werkzeugen sind teils noch in der Syntax der csh-Familie (csh, tcsh) geschrieben, und eine Konfigurationsdatei, die mit source eingelesen wird, muss zur Art der Shell passen.

Jetzt üben: Fragen zu Shell

touch legt eine neue Datei ausgehend von 666 an und mkdir ein neues Verzeichnis ausgehend von 777, jeweils ohne die in der umask gesetzten Bits. Welche Kombination von Rechten ergibt sich für eine neue Datei und ein neues Verzeichnis, die in einer Shell mit umask 027 angelegt werden?

  1. ADatei 637, Verzeichnis 750
  2. BDatei 640, Verzeichnis 750
  3. CDatei 750, Verzeichnis 750
Antwort und Erläuterung anzeigen

Antwort: B. Datei 640, Verzeichnis 750

Die umask gibt die Rechte-Bits an, die bei neu angelegten Dateien und Verzeichnissen „entfernt“ werden. 027 entfernt bei der Gruppe das Schreiben (2) und bei den anderen Lesen, Schreiben und Ausführen (7); eine Datei wird daher aus 666 zu rw-r----- (640) und ein Verzeichnis aus 777 zu rwxr-x--- (750). Das ist keine oktale Subtraktion, sondern ein bitweises Entfernen (666 AND NOT 027). Mit der häufig verwendeten umask 022 ergibt dieselbe Rechnung 644 für Dateien und 755 für Verzeichnisse.

Häufige Fragen

Was ist der Unterschied zwischen einer Shell und einem Terminal?

Ein Terminal (Terminalemulator) ist ein Programm, das als Fenster dient: Es zeigt Zeichen an und nimmt Tastatureingaben entgegen. Die Shell läuft darin, interpretiert die empfangenen Zeichenketten als Befehle und führt sie aus. Im selben Terminal kann man etwa von bash zu zsh wechseln.

Was ist der Unterschied zwischen „source Datei“ und „./Datei“?

Bei ./Datei führt ein neuer Shell-Prozess das Skript aus; darin geänderte Variablen oder das aktuelle Verzeichnis bleiben nach dem Ende in der ursprünglichen Shell nicht erhalten. source (oder .) führt den Inhalt der Datei in der aktuellen Shell aus, sodass etwa gesetzte Umgebungsvariablen bestehen bleiben. Deshalb werden Konfigurationsdateien, die die Umgebung eines Werkzeugs vorbereiten, mit source eingelesen.

„Shell“ in den Erläuterungen

Fragen mit „Shell“ (11)

  1. touch legt eine neue Datei ausgehend von 666 an und mkdir ein neues Verzeichnis ausgehend von 777, jeweils ohne die in der umask gesetzten Bits. Welche Kombination von Rechten ergibt sich für eine neue Datei und ein neues Verzeichnis, die in einer Shell mit umask 027 angelegt werden?
  2. Welche Zeichen werden angezeigt, wenn die beiden obigen Zeilen in einer Shell ausgeführt werden?
  3. In welchem Fall ist die Bedingung des obigen if in einem Shell-Skript wahr?
  4. Was geschieht im Allgemeinen mit dem Wert 3, wenn die Funktion main in C mit „return 3;“ endet?
  5. Im Home-Verzeichnis zeigt „ls“ nur notes.txt an, „ls -a“ dagegen „.“, „..“, „.bashrc“ und „notes.txt“. Welche Erklärung dieses Ergebnisses ist richtig?
  6. Ein Verzeichnis enthält die sechs Dateien a1.txt, a2.txt, a10.txt, b1.txt, c1.txt und a1.csv. Wie viele Dateien werden angezeigt, wenn in diesem Verzeichnis „ls [ab]?.txt“ ausgeführt wird?
  7. Welche Beschreibung der Dateien, die GNU find mit „find /data -name "*.log" -mtime +7 -size +100M“ findet, ist richtig?
  8. Auf einem per SSH erreichten Server wurde eine langwierige Berechnung mit „./run.sh &“ gestartet; als die Verbindung getrennt wurde, brach auch die Berechnung ab. Wie startet man sie am besten, damit sie nach dem Trennen der Verbindung weiterläuft?
  9. Welche Ausgaben erzeugen die beiden echo-Befehle, wenn die obigen Befehle nacheinander ausgeführt werden?
  10. Ein ausführbares Skript run.sh im aktuellen Verzeichnis ergibt bei Eingabe von „run.sh“ die Meldung „command not found“, lässt sich aber durch Eingabe von „./run.sh“ ausführen. Was ist der Grund?
  11. Welche Kombination der Ausgaben der beiden bash -c-Befehle ergibt sich, wenn die obigen Befehle nacheinander ausgeführt werden?

Verwandte Begriffe

Variable Umgebungsvariable Rückgabewert Zugriffsrechte (Dateiberechtigungen) SSH Ein-/Ausgabeumleitung Argument cron Git grep

Zur Glossarübersicht