it-swarm.com.de

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

wenn ich schreibe,

#!/bin/bash
echo "foo"

oder

#!/bin/sh
echo "foo"

beides ergibt das gleiche. Ich habe einige Skripte gesehen, die mit #!/bin/sh oder #!/bin/bash beginnen. Gibt es einen Unterschied zwischen ihnen?

273
Rahul Virpara

bash und sh sind zwei verschiedene Schalen. Grundsätzlich ist bashsh, mit mehr Funktionen und einer besseren Syntax. Die meisten Befehle funktionieren gleich, sind jedoch unterschiedlich.

Allerdings sollten Sie erkennen, dass /bin/sh auf den meisten Systemen eine symbolische Verknüpfung ist und sh nicht aufruft. In Ubuntu wurde /bin/sh zum Verknüpfen mit bash verwendet, ein typisches Verhalten bei Linux-Distributionen, aber jetzt wurde die Verknüpfung mit eine andere Shell namens dash geändert. Ich würde bash verwenden, da dies so ziemlich der Standard ist (oder zumindest meiner Erfahrung nach am häufigsten vorkommt). Tatsächlich treten Probleme auf, wenn ein Bash-Skript #!/bin/sh verwendet, da der Skripthersteller davon ausgeht, dass die Verknüpfung zu bash besteht, wenn dies nicht erforderlich ist.

Weitere Informationen erhalten Sie unter http://man.cx/sh , http://man.cx/bash .

235
reverendj1

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 das Interpretieren 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 Abkömmling anderer Shells, die in der gesamten Unix-Geschichte verwendet wurden. Sein Name bash ist eine Abkürzung für Bourne-Again Shell, eine Hommage an die Bourne-Shell, die es ersetzen soll, obwohl es auch Funktionen aus der C-Shell und der Korn-Shell enthält .

Es wird heutzutage von /bin/bash ausgeführt - auf jedes System mit Bash kann hier zugegriffen werden.

Es sind jedoch nicht nur Benutzer, die Shells verwenden. Skripte ( Shellskripte 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 aufweisen. Wenn es darum geht, Skripte auszuführen, kann dies ein echtes Problem sein. bash verfügt über eine Reihe von Skriptfunktionen, die nur für bash und nicht für andere Shells gelten. Dies ist in Ordnung, wenn Sie diese Skripte immer mit bash ausführen. Andere Shells versuchen möglicherweise, Bash zu emulieren oder den POSIX-Standard zu befolgen, der Bash ziemlich gut unterstützt (obwohl er seine eigenen Erweiterungen hinzufügt).

Es ist möglich, oben in einem Shell-Skript 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 System-Shell darstellt. Tatsächlich wird es normalerweise als symbolischer Link implementiert, der auf die ausführbare Datei verweist, unabhängig davon, für welche Shell die System-Shell ist. Die System-Shell ist eine Art Standard-Shell, die Systemskripts verwenden sollten. In Linux-Distributionen war dies lange Zeit normalerweise eine symbolische Verknüpfung zu bash , so dass es zu einer Art Konvention geworden ist,/bin/sh immer mit bash oder zu verknüpfen eine bash-kompatible Shell. In den letzten Jahren haben sich Debian (und Ubuntu) jedoch entschlossen, das System Shell von bash auf dash umzustellen - eine ähnliche Shell, die mit einer langen Tradition in Linux (nun ja, GNU), bash zu verwenden, bricht für/bin/sh. Dash wird als eine leichtere und viel schnellere Shell angesehen, die sich günstig auf die Startgeschwindigkeit auswirkt (und andere Dinge, die viele Shell-Skripte erfordern, z. B. 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 System-Shell) als Shebang verwenden, die jedoch bash-spezifische Erweiterungen erfordern. Dies wird gegenwärtig als ein Fehler angesehen, der von Debian und Ubuntu behoben werden sollte , die/bin/sh benötigen, um funktionieren zu können, wenn auf das Bindestrich gezeigt wird.

Auch wenn Ubuntus System-Shell auf einen Gedankenstrich zeigt, ist Ihre Login-Shell als Benutzer zu diesem Zeitpunkt immer noch heftig. Das heißt, wenn Sie sich an einer beliebigen Stelle in Linux bei einem Terminal-Emulator anmelden, wird Ihre Anmeldeshell gestartet. Die Betriebsgeschwindigkeit ist weniger problematisch, wenn die Shell interaktiv verwendet wird und die Benutzer mit Bash vertraut sind (und möglicherweise bash-spezifische Anpassungen in ihrem Ausgangsverzeichnis haben).

Was Sie beim Schreiben von Skripten verwenden sollten

Wenn für Ihr Skript Funktionen erforderlich sind, die nur von Bash unterstützt werden, verwenden Sie #!/bin/bash.

Wenn es jedoch überhaupt möglich ist, sollten Sie sicherstellen, dass Ihr Skript POSIX-kompatibel ist, und #!/bin/sh verwenden, das in jeder Installation zuverlässig auf die bevorzugte POSIX-kompatible System-Shell verweisen sollte.

80
thomasrutter

Zusätzlich zu den vorherigen Antworten ist /bin/sh eine symbolische Verknüpfung zu /bin/bash, #!/bin/sh entspricht jedoch nicht vollständig #!/bin/bash.

Aus der Manpage bash (1) :

"Wenn bash mit dem Namen sh aufgerufen wird, wird versucht, das Startverhalten historischer Versionen von sh so genau wie möglich nachzuahmen, wobei auch der POSIX-Standard eingehalten wird."

Zum Beispiel die bash-spezifische Syntax:

 exec  > >(tee logfile.txt)

gibt einen Fehler in einer Shell aus, der mit #!/bin/sh beginnt, auch wenn der symbolische Link sh-> bash vorhanden ist.

18
AnkiF

GNU Bash: #!/bin/bash; POSIX-Shell: #!/bin/sh.