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 beginnen #!/bin/bash
. Gibt es einen Unterschied zwischen ihnen?
bash
und sh
sind zwei verschiedene Schalen. Grundsätzlich bash
ist sh
mit mehr Funktionen und einer besseren Syntax. Die meisten Befehle funktionieren gleich, sind jedoch unterschiedlich.
Allerdings sollten Sie feststellen, dass /bin/sh
auf den meisten Systemen eine symbolische Verknüpfung besteht und diese nicht aufgerufen wird sh
. In Ubuntu /bin/sh
verwendet, 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/sh
da der Skripthersteller davon ausgeht, dass der Link zu einem bash
Zeitpunkt besteht, an dem dies nicht erforderlich ist.
Weitere Informationen finden Sie unter http://man.cx/sh , http://man.cx/bash .
/bin/sh
verwendet 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_shellUnter 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/bash
Heutzutage 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/bash
in 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.quelle
Zusätzlich zu den vorherigen Antworten, auch wenn
/bin/sh
es sich um eine symbolische Verknüpfung handelt/bin/bash
,#!/bin/sh
ist dies nicht ganz gleichbedeutend mit#!/bin/bash
.Aus der bash (1) -Manpage :
Zum Beispiel die bash-spezifische Syntax:
#!/bin/sh
Gibt einen Fehler in einer Shell aus, die mit beginnt , auch wenn der symbolische Link sh-> bash vorhanden ist.quelle
GNU Bash:
#!/bin/bash
; POSIX - Shell:#!/bin/sh
.quelle