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

208

wenn ich schreibe,

#!/bin/bash
echo "foo"

oder

#!/bin/sh
echo "foo"

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

    
virpara 25.05.2012, 05:59

3 Antworten

176

bash und sh sind zwei verschiedene Shells. Grundsätzlich ist bash sh , mit mehr Funktionen und besserer Syntax. Die meisten Befehle funktionieren gleich, aber sie sind unterschiedlich.

Nachdem Sie das gesagt haben, sollten Sie erkennen, dass /bin/sh auf den meisten Systemen ein symbolischer Link ist und sh nicht aufruft. In Ubuntu /bin/sh verwendet, um auf bash zu verlinken, typisches Verhalten bei Linux-Distributionen, aber jetzt hat sich die Verknüpfung zu einer anderen Shell namens dash . Ich würde bash verwenden, da dies ziemlich der Standard ist (oder zumindest aus meiner Erfahrung am häufigsten). Tatsächlich treten Probleme auf, wenn ein Bash-Skript #!/bin/sh verwendet, weil der Script-Maker annimmt, dass der Link bash ist, wenn es nicht sein muss.

Weitere Informationen finden Sie unter Link , Link .

    
reverendj1 25.05.2012, 06:08
62

Auf 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, besonders wenn Sie komplizierte Logik wie Pipes, Bedingungen usw. einfügen.

bash ist die am häufigsten verwendete Shell, die als Standard-Shell für Benutzer von Linux-Systemen verwendet wird . Es ist ein geistiger Abkömmling anderer Shells, die in der ganzen Unix-Geschichte verwendet wurden. Sein Name bash ist eine Abkürzung für Bourne-Again Shell, eine Hommage an die Bourne-Shell, die er ersetzen sollte, obwohl er auch Funktionen aus der C-Shell und der Korn-Shell enthält.

Es wird in diesen Tagen von /bin/bash ausgeführt - jedes System mit bash wird es hier zugänglich machen.

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 kleine Inkonsistenzen zwischen ihnen haben, und wenn es um das Ausführen von Scripts geht, können diese ein echtes Problem sein. bash hat ziemlich viele Skriptfunktionen, die nur für bash und nicht für andere Shells spezifisch sind. Das ist in Ordnung, wenn Sie die Skripts immer mit bash ausführen. Andere Shells versuchen möglicherweise, Bash zu emulieren oder dem POSIX-Standard zu folgen, der 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 -System-Shell darstellt. Tatsächlich wird es normalerweise als eine symbolische Verbindung implementiert, die auf die ausführbare Datei für die Shell verweist, die die Systemshell ist. Die System-Shell ist eine Art Standard-Shell, die System-Skripte verwenden sollten. In Linux-Distributionen war dies lange Zeit eine symbolische Verbindung zu bash , so dass es zu einer Konvention geworden ist, immer / bin / sh mit bash oder einer bash-kompatiblen Shell zu verknüpfen . In den letzten Jahren entschied sich Debian (und Ubuntu) jedoch, die System-Shell von bash auf Bindestrich umzustellen - ähnlich Shell-Breaking mit einer langen Tradition in Linux (naja, GNU) von Bash für / bin / sh. Dash wird als eine leichtere und viel schnellere Shell angesehen, die für die Boot-Geschwindigkeit von Vorteil sein kann (und andere Dinge, die viele Shell-Skripte erfordern, wie Paketinstallations-Skripte).

Dash ist ziemlich gut mit bash kompatibel und basiert auf dem gleichen POSIX-Standard. Die Bash-spezifischen Erweiterungen werden jedoch nicht implementiert. Es gibt Skripte, die #!/bin/sh (die System-Shell) als ihren Shebang verwenden, aber Bash-spezifische Erweiterungen erfordern. Dies wird derzeit als ein Bug angesehen, der von Debian und Ubuntu behoben werden sollte, der / bin / sh benötigt, wenn er auf den Bindestrich zeigen soll.

Obwohl Ubuntus -System-Shell auf einen Gedankenstrich zeigt, ist Ihre Login-Shell als Benutzer weiterhin bash. Das heißt, wenn Sie sich unter Linux an einem Terminalemulator anmelden, ist Ihre Login-Shell bash. Geschwindigkeit der Operation ist nicht so sehr ein Problem, wenn die Shell interaktiv verwendet wird, und Benutzer sind vertraut mit bash (und möglicherweise Bash-spezifische Anpassungen in ihrem Home-Verzeichnis).

Was Sie beim Schreiben von Skripts verwenden sollten

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

Aber wenn es möglich ist, wäre es gut, sicherzustellen, dass Ihr Skript POSIX-kompatibel ist, und verwenden Sie #!/bin/sh , was immer ziemlich zuverlässig auf die bevorzugte POSIX-kompatible Systemshell in jeder Installation zeigen sollte / p>     

thomasrutter 25.05.2012 10:31
15

Zusätzlich zu den vorherigen Antworten, auch wenn /bin/sh eine symbolische Verbindung zu /bin/bash ist, entspricht #!/bin/sh nicht vollständig #!/bin/bash .

Von der bash (1) man-Seite :

  

"Wenn bash mit dem Namen sh aufgerufen wird, versucht es den Start zu imitieren   Verhalten von historischen Versionen von sh so nah wie möglich, während   konform zum POSIX-Standard. "

Zum Beispiel die Bash-spezifische Syntax:

 exec  > >(tee logfile.txt)

gibt in einer Shell, die mit #!/bin/sh beginnt, einen Fehler, selbst wenn der symbolische Link sh- & gt; bash vorhanden ist.

    
AnkiF 14.01.2015 12:24

Tags und Links