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 bash
und 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?
sh
undbash
): http://en.wikipedia.org/wiki/Comparison_of_command_shellsAntworten:
bash
ist eine Obermenge vonsh
ie. Alles, was Sie in tunsh
können, können Sie in tunbash
.Bash verfügt über mehr Funktionen (Verzweigungen, eingebaute Elemente, Arrays), die das Schreiben von Skripten erleichtern. Einige spätere * nix'es haben
/bin/sh
als Link zu/bin/bash
Für eine vollständige Erklärung, was hier ein Tutorial ist
quelle
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_shellsh
wü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.sh
nicht einfach erweitert wurde: Sein Quellcode ist die Hölle pur. Schau mal. Es soll C ... seinHerkö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
sh
Befehl 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
sh
Befehl jedoch fast immer nur eine Verknüpfung zubash
, mit denselben Funktionen.quelle
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 bash
hat 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:
Mann Bash :
Die Nachahmung von Bourne-Muscheln ist ansonsten ziemlich begrenzt.
bash +B
(Bourne) würde Funktionen wie die Klammererweiterung deaktivieren.Aber selbst wenn Sie den POSIX-Modus deaktivieren, verhält sich das Echo
echo -e
standardmäßig so:/ 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 +B
stattdessen 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.
quelle
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:
So wie
sh
es versucht, historisches sh-Verhalten zu emulieren. Wiebash
versucht sie so nützlich wie möglich als interaktive Login - Shell zu sein.quelle
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).
quelle
ldconfig
oder Ihr/lib
Verzeichnis aus irgendeinem Grund gelöscht wurde.