HOWTO · Linux
Unterschied zwischen Sh und Bash
Dieses Tutorial erklärt, was eine Shell ist, indem man die aktuell verwendete Shell kennt, die Liste aller verfügbaren Shells überprüft und den Unterschied zwischen sh und bash.
Auf dieser Seite
Eine Shell ist ein Befehlsinterpreter. Um den in Ihrem Terminal laufenden Shell-Prozess zu bestimmen, untersuchen Sie diesen Prozess; um die für Ihr Konto konfigurierte Shell zu ermitteln, lesen Sie den Kontoeintrag aus. Die Datei /etc/shells des Systems listet Shells auf, die als gültige Login-Shells akzeptiert werden. Verwenden Sie sh für portable Skripte im POSIX-Stil und Bash, wenn Sie zusätzliche Funktionen benötigen.
Was ist eine Shell?
Eine Shell liest Befehle und koordiniert deren Ausführung durch das Betriebssystem. Eine interaktive Shell nimmt Befehle über ein Terminal entgegen; eine Skriptdatei kann dagegen Befehle enthalten, die ein Interpreter ausführt. Linux-Systeme können mehrere Shells bereitstellen, etwa Bash, Dash oder eine andere POSIX-kompatible Implementierung. Die Shell, die Sie gerade verwenden, die für Ihr Konto konfigurierte Shell und der Interpreter für ein bestimmtes Skript hängen zusammen, sind aber unterschiedliche Dinge.
Wie finden Sie die aktuelle Shell?
Um den aktuellen Shell-Prozess unter Linux zu untersuchen, führen Sie ps -p "$$" -o comm= aus. Der Parameter $$ wird zum Prozessbezeichner der aktuellen Shell aufgelöst, und ps gibt den Befehlsnamen dieses Prozesses aus. So ermitteln Sie den laufenden Prozess, aber nicht unbedingt die Shell, mit der Ihr Konto beim Anmelden startet. Ein Prozess, der von einer anderen Shell, einem anderen Terminal oder einem Skript gestartet wurde, kann sich von der konfigurierten Login-Shell unterscheiden.
Der Kontoeintrag in /etc/passwd speichert eine konfigurierte Login-Shell, keinen laufenden Prozess. Für das aktuelle Konto fragt getent passwd "$USER" die Kontendatenbank des Systems ab und gibt den Eintrag aus; das letzte, durch Doppelpunkte getrennte Feld enthält den Pfad der konfigurierten Shell. Dieser kann von der aktuell laufenden Shell abweichen. Auch Kontendienste und die Umgebungskonfiguration können beeinflussen, wie eine Sitzung startet. Wenn Sie wissen möchten, „was läuft gerade?“, untersuchen Sie daher den Prozess.
Wie finden Sie die verfügbaren Shells?
Lesen Sie /etc/shells, zum Beispiel mit cat /etc/shells, um die Pfade zu sehen, die Ihr System als gültige Login-Shells aufführt. Der Inhalt unterscheidet sich je nach System. Die Datei enthält kein vollständiges Verzeichnis aller auf dem Rechner installierten Shell-Programme: Ein installiertes Programm muss dort nicht aufgeführt sein, und ein gelisteter Pfad kann über einen symbolischen Link verwaltet werden. Prüfen Sie damit, ob eine Shell als Login-Shell zugelassen ist. Die Datei belegt weder, dass ein aufgeführtes Programm gerade läuft, noch, dass jede installierte Shell darin steht.
Der Befehl sh und seine Verwendung
sh ist die traditionelle Bezeichnung für einen Befehlsinterpreter. Beim portablen Shell-Scripting bedeutet sh üblicherweise, Skripte in der POSIX-Shell-Sprache zu schreiben, damit sie mit kompatiblen Implementierungen ausgeführt werden können. POSIX legt gemeinsames Verhalten fest; /bin/sh ist jedoch ein Pfad, dessen Implementierung vom Betriebssystem und der Distribution abhängt. Er kann auf Dash, Bash oder eine andere Shell verweisen. Nehmen Sie ohne Prüfung Ihres Systems keine bestimmte Implementierung an.
Die erste Zeile eines Skripts, der sogenannte Shebang, nennt den Interpreter, der verwendet wird, wenn das Skript als ausführbare Datei gestartet wird. #!/bin/sh fordert beispielsweise den Interpreter unter /bin/sh an, garantiert aber nicht, welche Implementierung dieser Pfad auswählt. Sie können dasselbe Skript auch über die Befehlszeile ausdrücklich an sh übergeben. Vermeiden Sie Bash-spezifische Syntax in Skripten für sh und verwenden Sie POSIX-definierte Konstrukte, wenn Portabilität wichtig ist.
Führen Sie dieses Beispiel aus:
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
printf 'Hello, shell!\n'
Hello, shell!
Dieser eigenständige Befehl gibt die Ausgabe aus, die in den bereitgestellten Laufzeitnachweisen festgehalten wurde.
Bash und seine Verwendung
Bash (Bourne Again SHell) ist eine weitverbreitete Shell mit Funktionen, die über portables sh-Scripting hinausgehen. Dazu gehören Arrays, Tests mit [[ ... ]] und Prozesssubstitution. Wenn ein Skript solche Erweiterungen verwendet, sollte es Bash im Shebang angeben, etwa mit #!/bin/bash, und mit Bash ausgeführt werden. Bash ist unter Linux verbreitet, aber nicht auf jedem Linux-System die Standard-Shell.
Bash kann auch im POSIX-Modus ausgeführt werden. Starten Sie Bash dazu mit bash --posix oder aktivieren Sie den Modus in einem Bash-Skript mit set -o posix. Dadurch verhält sich Bash stärker im Einklang mit den POSIX-Anforderungen; es wird dadurch weder zu einer eigenständigen sh-Implementierung noch wird jedes Bash-spezifische Skript portabel. Wenn Portabilität wichtig ist, schreiben Sie Skripte in der POSIX-Shell-Sprache und testen Sie sie mit den Shells der Zielsysteme.