Was ist der Unterschied zwischen bash und sh?

28

Ich sehe zwei Arten von Code:

#!/usr/bin/sh

und:

#!/user/bin/bash

Ich habe online danach gesucht und die Meinungen sind sehr unterschiedlich. Die Erklärungen, die ich auf den meisten Websites gesehen habe, besagen, dass sie shälter sind als bashund dass es keinen wirklichen Unterschied gibt.

Kennt jemand den Unterschied zwischen diesen? Können Sie mir ein praktisches Beispiel geben, wann man eins übereinander verwendet?

Saif Bechan
quelle
Für einen allgemeinen Überblick über die verschiedenen Shells (nicht nur shund bash): http://en.wikipedia.org/wiki/Comparison_of_command_shells
Akira
1
Eine weitere großartige Geschichte hier: faqs.org/faqs/unix-faq/shell/shell-differences
John Wright

Antworten:

34

bashist eine Obermenge von shie. Alles, was Sie in tun shkönnen, können Sie in tun bash.

Bash verfügt über mehr Funktionen (Verzweigungen, eingebaute Elemente, Arrays), die das Schreiben von Skripten erleichtern. Einige spätere * nix'es haben /bin/shals Link zu/bin/bash

Für eine vollständige Erklärung, was hier ein Tutorial ist

Nifle
quelle
5
@ Saif Bechan: Ein Grund, warum die Bourne-Shell ( sh) nicht nur erweitert wurde, ist, dass Bash` von jemand anderem geschrieben wurde. Ich wette auch, dass es Lizenzprobleme gab. Lesen Sie den Artikel über die Bourne-Shell en.wikipedia.org/wiki/Bourne_shell
Felix
7
Das Entfernen shwürde viele Skripte beschädigen , von denen erwartet wird, dass sie dort sind, und sich darauf verlassen, wie sie die Dinge analysieren. Linux-Benutzer interessieren sich vielleicht nicht dafür, aber die Leute, die tausende Dollar für Solaris, AIX oder HP-UX ausgeben, sind möglicherweise sehr verärgert.
30.03.10
3
... und für noch mehr Spaß, Ubuntu Symlinks / bin / sh zu sprengen. Dash ist nicht vollständig sh- oder bash-konform, soll jedoch schneller starten. Wenn das System bootet, laufen alle init.d-Skripte und ich denke, die insgesamt eingesparte Zeit ist es wert.
kbyrd
8
Ich bin mir ziemlich sicher, dass Dash vollständig sh-konform ist. Das Problem ist, dass einige Leute Skripte schreiben, die / bin / sh sagen, aber das Skript selbst benötigt / bin / bash, um zu funktionieren. Niemand bemerkt ein Problem, weil / bin / sh die meiste Zeit einfach auf / bin / bash zeigt.
Davr
8
@Saif: Es gibt noch einen anderen Grund, warum shnicht einfach erweitert wurde: Sein Quellcode ist die Hölle pur. Schau mal. Es soll C ... sein
Grawity
6

Herkömmlicherweise war / bin / sh die ursprüngliche Bourne-Shell, die weder den Verlauf noch die Befehlszeilenbearbeitung und keine Jobsteuerung enthält.

In den letzten 15 Jahren wurde auf den meisten Unixen die POSIX-Shell installiert, oder zumindest ksh oder bash (die fast POSIX-ähnlich sind), aber immer noch die eingeschränktere Shell in / bin / sh

Der Grund dafür ist, dass ältere Shell-Skripte, die den älteren shBefehl erwarten , weiterhin funktionieren.
Da Zeichen mögen {, }und !haben eine besondere Bedeutung zu bash, ist es möglich , dass ein älterer Shell - Skript dieser Zeichen (ohne sie zu entkommen) mit fehlschlagen könnte.
(Die Bourne-Shell würde dies !!{1,2}wörtlich nehmen , während Bash dies als eine Wiederholung des vorherigen Befehls ( !!) interpretieren würde, gefolgt von einer geschweiften Klammer).

Unter Linux ist der shBefehl jedoch fast immer nur eine Verknüpfung zu bash, mit denselben Funktionen.

njd
quelle
2
Bash soll sich (aber nicht immer) im sh-Kompatibilitätsmodus verhalten, wenn es als / bin / sh aufgerufen wird. Eine Menge Sachen gingen kaputt, als Ubuntu / bin / sh von der Verknüpfung mit / bin / bash auf die Verknüpfung mit / bin / dash umstellte. Das Zeug, das brach, vermutete Bashismen, als sie Standard-Sh hätten verwenden sollen.
Broam
4

sh kann entweder Bourne-Shell oder / bin / sh bedeuten, eine andere (POSIX-konforme) Shell auf den meisten modernen Plattformen. "Die POSIX-Shell" ist die von POSIX definierte abstrakte Shell , die von bash im POSIX-Modus oder standardmäßig von ksh oder dash implementiert wird. / bin / sh wird manchmal auch als POSIX-Shell bezeichnet, da es sich um eine Shell handelt, die auf den meisten Plattformen mit POSIX kompatibel ist. Die ursprünglichen Bourne-Shells sind keine POSIX-Shells.

bashref enthält eine Liste der Unterschiede zwischen bash- und Bourne-Shells . man bashhat eine Liste der Änderungen, wenn Bash im POSIX-Modus aufgerufen wird .

/ bin / sh ist unter OS X kein Symlink oder Hardlink, aber fast so groß wie / bin / bash:

$ ls -li /bin/{ba,}sh
29631757 -r-xr-xr-x  1 root  wheel  1333920 Jul 26 01:52 /bin/bash
29631758 -r-xr-xr-x  1 root  wheel  1334000 Jul 26 01:52 /bin/sh

Mann Bash :

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.

Die Nachahmung von Bourne-Muscheln ist ansonsten ziemlich begrenzt. bash +B(Bourne) würde Funktionen wie die Klammererweiterung deaktivieren.

$ sh
$ echo {a,b}
a b
$ echo $BASH_VERSION
3.2.48(1)-release
$ bash +B
$ echo {a,b}
{a,b}

Aber selbst wenn Sie den POSIX-Modus deaktivieren, verhält sich das Echo echo -estandardmäßig so:

$ sh
$ shopt -uo posix
$ echo '1\b2'
2

/ bin / sh ist unter Ubuntu ein Bindestrich , daher funktionieren einige Bashismen mit / bin / sh unter OS X, aber nicht mit Ubuntu.

Wenn Sie tatsächlich Skripte für (so etwas wie) die Original-Bourne-Shells schreiben möchten, können Sie #!/usr/bin/env bash +Bstattdessen verwenden.

Ich denke, es ist einfacher, Skripte für Bash zu schreiben, als Features zu vermeiden, die nicht Teil der POSIX-Spezifikationen oder Bourne-Shells sind, oder alles mit anderen Shells zu testen.

Lri
quelle
2

Obwohl / bin / sh eine Verknüpfung zu / bin / bash sein kann, verhält es sich anders, wenn es als sh gestartet wird. Aus der Bash-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.

So wie shes versucht, historisches sh-Verhalten zu emulieren. Wie bashversucht sie so nützlich wie möglich als interaktive Login - Shell zu sein.

KeithB
quelle
2

Auf vielen Systemen und insbesondere auf Solaris ist bash dynamisch verbunden, während sh statisch verbunden ist. Dies kann eine Sicherheitsbedrohung darstellen. Aus diesem Grund sollte der Root-Benutzer / bin / sh nur als Shell verwenden (falls Sie sich jemals als Root anmelden müssen).

Alessandro Vozza
quelle
2
Kann auch im Notfall nützlich sein, wenn Sie etwas Schlechtes getan haben ldconfigoder Ihr /libVerzeichnis aus irgendeinem Grund gelöscht wurde.
LawrenceC