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


280

wenn ich schreibe,

#!/bin/bash
echo "foo"

oder

#!/bin/sh
echo "foo"

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

Antworten:


242

bashund shsind zwei verschiedene Schalen. Grundsätzlich bashist shmit mehr Funktionen und einer besseren Syntax. Die meisten Befehle funktionieren gleich, sind jedoch unterschiedlich.

Allerdings sollten Sie feststellen, dass /bin/shauf den meisten Systemen eine symbolische Verknüpfung besteht und diese nicht aufgerufen wird sh. In Ubuntu /bin/shverwendet, um zu verknüpfen bash, typisches Verhalten auf Linux-Distributionen, aber jetzt hat sich die Verknüpfung zu einer anderen Shell namens Bindestrich geändert . Ich würde verwenden bash, 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 verwendet wird, #!/bin/shda der Skripthersteller davon ausgeht, dass der Link zu einem bashZeitpunkt besteht, an dem dies nicht erforderlich ist.

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


24
Ihr erster Absatz ist ziemlich irreführend. "sh" ist überhaupt keine Shell, sondern ein Symlink zur aktuell konfigurierten System-Shell , die auf Linux-Systemen normalerweise entweder bash oder dash ist (neuere Versionen von Ubuntu verwenden letztere).
Thomasrutter

18
/bin/shverwendet eine Schale genannt zu werden Bourne - Shell - 1977 ist ein heftiger Schlag zurück / bin / sh kompatibel Schale , die kann als Bourne - Shell - Ersatz verwendet werden, der POSIX - konformer. en.wikipedia.org/wiki/Bourne_shell
Alex

5
bash ist ein De-facto-Standard (sehr weit verbreitet), aber kein "Standard". sh unter Ubuntu verwendet dash , eine Posix-kompatible Shell, also ist sie wirklich Standard. Mein Rat ist, Dash so oft wie möglich für Skripte zu verwenden , insbesondere für serverseitige Skripte. Obwohl bash aussagekräftiger ist, läuft dash viel schneller und ist sicherer.
Rick-777

@ Rick-777 Soll ich also #! / Bin / dash explizit oben in meine Skripte setzen? Ich habe auch Skripte geschrieben, in denen ich nur Befehle schreibe und mit ./scriptName ausführe, und das hat gut funktioniert. Ist das #! / Bin / yourShellHere notwendig?
user137717

@ Rick-777 In den Fällen, in denen ich ein #! / Bin / shellName ausschließe, habe ich die Dateien fileName.sh benannt. Wird dies implizit mit der bevorzugten System-Shell verknüpft, ohne #! / Bin / sh zu deklarieren?
user137717

82

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 am häufigsten verwendete Shell als Standard-Shell für Benutzer von Linux-Systemen. Es ist ein spiritueller Abkömmling anderer Shells, die in der gesamten Unix-Geschichte verwendet wurden. Der 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.

/bin/bashHeutzutage läuft es von - auf jedem System mit bash kann hier darauf 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/bashin der ersten Zeile angeben , was bedeutet, dass das Skript immer mit bash ausgeführt werden soll und nicht mit einer anderen Shell.

/ 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, für die die Shell die System-Shell ist. Die System-Shell ist eine Art Standard-Shell, die von Systemskripten verwendet werden sollte. In Linux-Distributionen war dies lange Zeit in der Regel eine symbolische Verknüpfung zu bash , so dass es zu einer Art 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 System-Shell von bash auf dash umzustellen- eine ähnliche Shell - Breaking mit einer langen Tradition in Linux (nun ja, GNU) der Verwendung von Bash 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, wie 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 Grundlage verwenden, jedoch bash-spezifische Erweiterungen erfordern. 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 das Bindestrich gezeigt wird.

Auch wenn Ubuntus System-Shell auf Dash zeigt, ist Ihre Anmeldeshell als Benutzer zu diesem Zeitpunkt noch nicht beendet. Das heißt, wenn Sie sich an einer beliebigen Stelle in Linux bei einem Terminal-Emulator anmelden, wird Ihre Anmeldeshell bash. 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 Ihr Skript Funktionen erfordert, die nur von bash unterstützt werden, verwenden Sie #!/bin/bash.

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


18

Zusätzlich zu den vorherigen Antworten, auch wenn /bin/shes sich um eine symbolische Verknüpfung handelt /bin/bash, #!/bin/shist dies nicht ganz gleichbedeutend mit #!/bin/bash.

Aus der bash (1) -Manpage :

"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)

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


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.