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


wenn ich schreibe,

#!/bin/bash
echo "foo"

oder

#!/bin/sh
echo "foo"

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


211
2018-05-25 03:59


Ursprung




Antworten:


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

Nachdem Sie das gesagt haben, sollten Sie erkennen /bin/sh auf den meisten Systemen wird eine symbolische Verbindung sein und nicht aufrufen sh. In Ubuntu /bin/sh verwendet, um zu verlinken bash, typisches Verhalten bei Linux-Distributionen, aber jetzt hat sich zu verlinken geändert eine andere Shell namens Dash. ich würde ... benutzen bash, denn das ist so ziemlich der Standard (oder zumindest am häufigsten, aus meiner Erfahrung). Tatsächlich treten Probleme auf, wenn ein Bash-Skript verwendet wird #!/bin/sh weil der Script-Maker annimmt, dass der Link zu ist bash wenn es nicht sein muss.

Für mehr Information, http://man.cx/sh, http://man.cx/bash.


178
2018-05-25 04:08



Ihr erster Absatz ist ziemlich irreführend. "sh" ist überhaupt keine Shell, sondern ein Symlink zu dem gerade konfigurierten System Shell, was auf Linux-Systemen normalerweise entweder Bash oder Dash ist (neuere Versionen von Ubuntu, die Letzteres verwenden). - thomasrutter
/bin/sh war früher eine Shell namens Bourne Shell zurück in 1977. Bash ist eine / bin / sh kompatible Shell, die kann als Bourne-Shell-Ersatz verwendet werden, der Posix-konform ist. en.wikipedia.org/wiki/Bourne_shell - Alex
bash ist ein De-facto-Standard (sehr weit verbreitet), aber es ist nicht "Standard"; Sch auf Ubuntu verwendet StrichDas ist eine Posix-konforme Hülle, also ist es wirklich Standard. Mein Rat ist zu verwenden Strich so oft wie möglich für Scripting, insbesondere für serverseitige Skripte. Obwohl bashist ausdrucksvoller, Strich läuft viel schneller und ist sicherer. - Rick-777
@ Rick-777 Also sollte ich #! / Bin / dash explizit an die Spitze meiner Skripte setzen? Ich habe auch Skripte geschrieben, wo ich nur Befehle schreibe und mit ./scriptName ausführe und das hat gut funktioniert. Ist die #! / Bin / yourShellHere notwendig? - user137717
@ Rick-777 In den Fällen, in denen ich #! / Bin / shellName ausschließe, habe ich die Dateien fileName.sh benannt. Wird das implizit mit der bevorzugten System-Shell verknüpft, ohne #! / Bin / sh zu deklarieren? - user137717


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

Die Shell ist nicht nur dafür verantwortlich, Ihre kleine Eingabeaufforderung zu zeichnen, sondern auch Ihre Befehle zu interpretieren, besonders wenn Sie komplizierte Logik wie Pipes, Conditionals 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. Seinen Namen, bash ist eine Abkürzung für 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 läuft in diesen Tagen von /bin/bash - Jedes System mit bash wird es hier zugänglich machen.

Es sind jedoch nicht nur Benutzer, die Shells verwenden. Skripte (Shell-Skripte) brauchen Muscheln, 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 eine ganze Reihe von Skriptfunktionen, die nur für bash und nicht für andere Shells gelten. Das ist in Ordnung, wenn Sie die Skripts immer mit bash ausführen. Andere Shells können versuchen, bash entweder zu emulieren oder dem POSIX-Standard zu folgen, der bash ziemlich gut unterstützt (obwohl er seine eigenen 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 angeben #!/bin/bash in der ersten Zeile, was bedeutet, dass das Skript immer mit bash statt mit einer anderen Shell ausgeführt werden sollte.

/ bin / sh ist eine ausführbare Datei, die das darstellt System Shell. 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 sehr, 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 dazu, die Systemshell von bash auf Strich - eine ähnliche Shell - bricht 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 verwenden #!/bin/sh (die System-Shell) als Shebang, die aber Bash-spezifische Erweiterungen benötigt. Dies wird derzeit als ein Fehler, der behoben werden sollte von Debian und Ubuntu, die / bin / sh benötigen, um arbeiten zu können, wenn sie auf den Bindestrich zeigen.

Obwohl Ubuntu's System Shell zeigt auf den Strich, dein Login-Shell als ein Benutzer weiterhin zu dieser Zeit Bash sein. 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 Skripten 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 es verwendet #!/bin/sh, die immer, ziemlich zuverlässig, in jeder Installation auf die bevorzugte POSIX-kompatible System-Shell verweisen sollte.


62
2018-05-25 08:31





Zusätzlich zu den vorherigen Antworten, auch wenn /bin/sh ist ein symbolischer Link zu /bin/bash, #!/bin/sh ist nicht völlig äquivalent zu #!/bin/bash.

Von dem 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 einen Fehler in einer Shell beginnend mit #!/bin/sh, selbst mit der symbolischen Verbindung von sh> bash.


15
2018-01-14 11:24