Was ist der Unterschied zwischen #!/bin/sh und #!/bin/bash?

Unter Linux und anderen Unix-ähnlichen Systemen haben Sie die Wahl zwischen mehreren Shells.

Die Shell ist nicht nur für das Zeichnen Ihrer kleinen Eingabeaufforderung verantwortlich, sondern auch für die Interpretation Ihrer Befehle, insbesondere wenn Sie komplizierte Logik wie Pipes, Bedingungen usw. eingeben.

bash ist die häufigste Shell, die als Standard-Shell für Benutzer von Linux-Systemen verwendet wird. Es ist ein spiritueller Nachkomme anderer Shells, die in der gesamten Unix-Geschichte verwendet wurden. Sein Name, bash ist eine Abkürzung von Bourne-Again Shell, eine Hommage an die Bourne-Shell, die es ersetzen sollte, obwohl es auch Funktionen aus der C-Shell und der Korn-Shell enthält.

Es wird heutzutage ab /bin/bash ausgeführt – auf jedes System mit bash kann hier zugegriffen werden.

Es sind jedoch nicht nur Benutzer, die Shells verwenden. Skripte (Shell-Skripte) benötigen Shells, um sie zu interpretieren. Wenn Sie ein Shell-Skript ausführen, muss Ihr System einen Shell-Prozess starten, um Ihr Skript auszuführen.

Das Problem ist, dass verschiedene Shells winzige Inkonsistenzen zwischen ihnen haben, und wenn es darum geht, Skripte auszuführen, können diese ein echtes Problem sein. bash hat ziemlich viele Skriptfunktionen, die nur für Bash und nicht für andere Shells einzigartig sind. Das ist in Ordnung, wenn Sie immer bash verwenden, um diese Skripte auszuführen. Andere Shells können versuchen, entweder bash zu emulieren oder sich an den POSIX-Standard zu halten, den bash ziemlich gut unterstützt (obwohl er eigene Erweiterungen hinzufügt).

Es ist möglich, am Anfang eines Shell-Skripts anzugeben, mit welcher Shell es mit einem Shebang ausgeführt werden soll. Ein Skript kann #!/bin/bash in der ersten Zeile angeben, was bedeutet, dass das Skript immer mit bash und nicht mit einer anderen Shell ausgeführt werden sollte.

/bin/sh ist eine ausführbare Datei, die die Systemshell darstellt. Tatsächlich wird es normalerweise als symbolischer Link implementiert, der auf die ausführbare Datei für die Shell verweist, bei der es sich um die Systemshell handelt. Die System-Shell ist eine Art Standard-Shell, die Systemskripte verwenden sollten. In Linux-Distributionen war dies lange Zeit normalerweise ein symbolischer Link zu bash, so sehr, dass es zu einer Konvention geworden ist, / bin / sh immer mit bash oder einer Bash-kompatiblen Shell zu verknüpfen. In den letzten Jahren haben Debian (und Ubuntu) jedoch beschlossen, die Systemshell von bash auf dash umzustellen – eine ähnliche Shell, die mit einer langen Tradition in Linux (naja, GNU) bricht, bash für / bin / sh zu verwenden. Dash wird als leichtere und viel schnellere Shell angesehen, die für die Startgeschwindigkeit von Vorteil sein kann (und andere Dinge, die viele Shell-Skripte erfordern, wie Paketinstallationsskripte).

Dash ist ziemlich gut mit bash kompatibel und basiert auf demselben POSIX-Standard. Die bash-spezifischen Erweiterungen werden jedoch nicht implementiert. Es gibt Skripte, die #!/bin/sh (die Systemshell) als Shebang verwenden, aber Bash-spezifische Erweiterungen benötigen. Dies wird derzeit als Fehler angesehen, der von Debian und Ubuntu behoben werden sollte, die / bin / sh benötigen, um funktionieren zu können, wenn auf dash verwiesen wird.

Obwohl Ubuntus System-Shell auf dash zeigt, ist Ihre Login-Shell als Benutzer zu diesem Zeitpunkt weiterhin bash. Das heißt, wenn Sie sich irgendwo in Linux bei einem Terminalemulator anmelden, ist Ihre Anmeldeshell bash. Die Geschwindigkeit der Bedienung ist nicht so sehr ein Problem, wenn die Shell interaktiv verwendet wird und Benutzer mit bash vertraut sind (und möglicherweise bash-spezifische Anpassungen in ihrem Home-Verzeichnis haben).

Was Sie beim Schreiben von Skripten verwenden sollten

Wenn Ihr Skript Funktionen erfordert, die nur von bash unterstützt werden, verwenden Sie #!/bin/bash.

Aber wenn überhaupt möglich, wäre es gut, sicherzustellen, dass Ihr Skript POSIX-kompatibel ist, und #!/bin/sh zu verwenden, das in jeder Installation immer zuverlässig auf die bevorzugte POSIX-kompatible Systemshell verweisen sollte.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.