Beim Schreiben von Shell-Programmen verwenden wir häufig /bin/sh
und /bin/bash
. Ich benutze normalerweise bash
, aber ich weiß nicht, was der Unterschied zwischen ihnen ist.
Was ist der Hauptunterschied zwischen bash
und sh
?
Was müssen wir beim Programmieren in bash
und beachten sh
?
Antworten:
Was ist sh
sh
(oder die Shell-Befehlssprache) ist eine Programmiersprache, die vom POSIX-Standard beschrieben wird . Es hat viele Implementierungen (ksh88
,dash
, ...).bash
kann auch als Implementierung von betrachtet werdensh
(siehe unten).Da
sh
es sich bei einer Spezifikation und nicht um eine Implementierung handelt,/bin/sh
handelt es sich um einen Symlink (oder einen Hardlink) zu einer tatsächlichen Implementierung auf den meisten POSIX-Systemen.Was ist Bash?
bash
Es wurde alssh
kompatible Implementierung gestartet (obwohl es einige Jahre vor dem POSIX-Standard liegt), hat aber im Laufe der Zeit viele Erweiterungen erhalten. Viele dieser Erweiterungen können das Verhalten gültiger POSIX-Shell-Skripte ändern, sodass sie für sich genommenbash
keine gültige POSIX-Shell sind. Es ist vielmehr ein Dialekt der POSIX-Shell-Sprache.bash
unterstützt einen--posix
Switch, wodurch er POSIX-kompatibler wird. Es wird auch versucht, POSIX nachzuahmen, wenn es als aufgerufen wirdsh
.sh = bash?
Lange Zeit
/bin/sh
verwendet, um/bin/bash
auf den meisten GNU / Linux-Systemen zu verweisen . Infolgedessen war es fast sicher geworden, den Unterschied zwischen den beiden zu ignorieren. Aber das hat sich in letzter Zeit geändert.Einige beliebte Beispiele für Systeme, auf
/bin/sh
die nicht hingewiesen wird/bin/bash
(und auf denen einige/bin/bash
möglicherweise gar nicht existieren), sind:sh
zudash
standardmäßig;initramfs
. Es verwendet dieash
Shell-Implementierung.pdksh
einen Nachkommen der Korn-Shell. FreeBSDssh
ist ein Nachkomme der ursprünglichen UNIX Bourne-Shell. Solaris hat eine eigene,sh
die lange Zeit nicht POSIX-konform war. Eine kostenlose Implementierung ist im Heirloom-Projekt verfügbar .Wie können Sie herausfinden, auf welche
/bin/sh
Punkte auf Ihrem System verwiesen wird?Die Komplikation ist, dass es
/bin/sh
sich um eine symbolische oder eine harte Verbindung handeln kann. Wenn es sich um eine symbolische Verbindung handelt, können Sie sie auf tragbare Weise beheben:Wenn es eine harte Verbindung ist, versuchen Sie es
Tatsächlich
-L
deckt das Flag sowohl Symlinks als auch Hardlinks ab. Der Nachteil dieser Methode ist jedoch, dass sie nicht portierbar ist. POSIX mussfind
die-samefile
Option nicht unterstützen , obwohl sowohl GNU find als auch FreeBSD find sie unterstützen.Shebang Linie
Letztendlich liegt es an Ihnen, zu entscheiden, welche Sie verwenden möchten, indem Sie die Zeile «shebang» als allererste Zeile des Skripts schreiben.
Z.B
wird verwenden
sh
(und was auch immer das passiert, um darauf hinzuweisen),wird verwendet,
/bin/bash
wenn es verfügbar ist (und schlägt mit einer Fehlermeldung fehl, wenn dies nicht der Fall ist). Natürlich können Sie auch eine andere Implementierung angeben, zWelches zu verwenden
Für meine eigenen Skripte bevorzuge ich
sh
aus folgenden Gründen:bash
, müssen sie es habensh
Die Verwendung bietet ebenfalls Vorteile
bash
. Seine Funktionen machen das Programmieren bequemer und ähneln dem Programmieren in anderen modernen Programmiersprachen. Dazu gehören beispielsweise lokale Variablen und Arrays mit Gültigkeitsbereich. Plainsh
ist eine sehr minimalistische Programmiersprache.quelle
bash
der Anzeige ausführen , sind nützlichere Fehlermeldungen im Falle eines Syntaxfehlers. Sie können einfach Zeit sparen, indem Sie bash verwenden.%
am Anfang Ihrer Befehlszeilen?$
anstelle von%
oder#
für die Root-Shell.$
und#
...sh
schon lange vor Bash existiert hat (was für Bourne-Again-Shell steht). Aber es war sehr primitiv und reagierte nicht auf terminale Ereignisse wieESC
Charaktere. Dannksh
kam (auch vor Bash), dann begann Bash von denen, die die Idee einer besseren Shell liebten, aber ksh hassten. :-)sh
: http://man.cx/shbash
: http://man.cx/bashTL; DR :
bash
ist eine Obermengesh
mit einer eleganteren Syntax und mehr Funktionalität. In fast allen Fällen ist es sicher, eine Bash-Shebang-Linie zu verwenden, da diese auf modernen Plattformen allgegenwärtig ist.NB: In einigen Umgebungen
sh
istbash
. Überprüfen Siesh --version
.quelle
Diese Frage wurde häufig als Kanonik für Personen nominiert, die versuchen, sie zu verwenden,
sh
und sind überrascht, dass sie sich nicht so verhält wiebash
. Hier finden Sie eine kurze Übersicht über häufige Missverständnisse und Fallstricke.Zunächst sollten Sie verstehen, was Sie erwartet.
sh scriptname
ausführen oder mit ausführenscriptname
und#!/bin/sh
in der Shebang- Zeile haben, sollten Sie POSIX-sh
Verhalten erwarten .bash scriptname
ausführen oder es ausführenscriptname
und#!/bin/bash
(oder das lokale Äquivalent) in der Shebang-Zeile haben, sollten Sie mit Bash-Verhalten rechnen.Ein korrekter Shebang und das Ausführen des Skripts durch Eingabe nur des Skriptnamens (möglicherweise mit einem relativen oder vollständigen Pfad ) ist im Allgemeinen die bevorzugte Lösung. Zusätzlich zu einem korrekten Shebang muss die Skriptdatei über die Ausführungsberechtigung (
chmod a+x scriptname
) verfügen .Wie unterscheiden sie sich eigentlich?
Das Bash-Referenzhandbuch enthält einen Abschnitt, in dem versucht wird, die Unterschiede aufzuzählen. Einige häufig auftretende Verwirrungsquellen sind jedoch
[[
ist nicht verfügbar insh
(nur[
was klobiger und begrenzter ist).sh
hat keine Arrays.local
,source
,function
,shopt
,let
,declare
, undselect
sind nicht tragbarsh
. (Einigesh
Implementierungen unterstützen zlocal
.for((i=0;i<=3;i++))
Schleife mit drei Argumenten , die+=
Zuweisung von Inkrementen usw. Die$'string\nwith\tC\aescapes'
Funktion wird vorläufig für POSIX akzeptiert (dh sie funktioniert jetzt in Bash, wird jedoch vonsh
Systemen, die nur den aktuellen Anforderungen entsprechen, noch nicht unterstützt POSIX-Spezifikation und wird wahrscheinlich noch einige Zeit nicht kommen).<<<'here strings'
.*.{png,jpg}
und{0..12}
klammert Expansion.Dies ist in POSIX enthalten, fehlt jedoch möglicherweise in einigen~
bezieht sich$HOME
nur auf Bash (und allgemeiner~username
auf das Home-Verzeichnis vonusername
)./bin/sh
Implementierungen vor POSIX .<(cmd)
und>(cmd)
.&|
für2>&1 |
und&>
für> ... 2>&1
<>
Umleitung.${substring:1:2}
,${variable/pattern/replacement}
, Fall Umwandlung usw.$[expression]
Syntax, die jedoch durch die arithmetische POSIX-$((expression))
Syntax ersetzt werden sollte. (Einige ältere Pre-POSIX-sh
Implementierungen unterstützen dies jedoch möglicherweise nicht.)$RANDOM
,$SECONDS
,$PIPESTATUS[@]
und$FUNCNAME
sind Bash - Erweiterungen.export variable=value
und[ "x" == "y" ]
die nicht portierbar sind (export variable
sollten von der Variablenzuweisung getrennt sein, und der Vergleich von tragbaren Zeichenfolgen[ ... ]
verwendet ein einzelnes Gleichheitszeichen).Denken Sie daran, dies ist eine gekürzte Auflistung. Die vollständige Übersicht finden Sie im Referenzhandbuch und unter http://mywiki.wooledge.org/Bashism. Dort finden Sie viele gute Problemumgehungen. und / oder versuchen Sie es mit http://shellcheck.net/, das vor vielen Nur-Bash-Funktionen warnt.
Ein häufiger Fehler besteht darin, eine
#!/bin/bash
Shebang-Zeile zu haben , diese aber dennoch zu verwendensh scriptname
, um das Skript tatsächlich auszuführen. Dies deaktiviert grundsätzlich alle Nur-Bash-Funktionen, sodass Sie Syntaxfehler erhalten, z. B. wenn Sie versuchen, Arrays zu verwenden. (Die Shebang-Zeile ist syntaktisch ein Kommentar, daher wird sie in diesem Szenario einfach ignoriert.)Leider warnt Bash nicht, wenn Sie versuchen, diese Konstrukte zu verwenden, wenn es als aufgerufen wird
sh
. Es deaktiviert auch nicht alle Nur-Bash-Funktionen vollständig.sh
Wenn Sie also Bash ausführen, indem Sie es aufrufen, ist dies keine gute Möglichkeit, um zu überprüfen, ob Ihr Skript ordnungsgemäß aufash
/dash
/ POSIXsh
oder Varianten wie Heirloom portierbar istsh
quelle
export variable=value
wird von POSIX beauftragt: pubs.opengroup.org/onlinepubs/009695399/utilities/export.html . Vielleicht ist es in einigen alten Muscheln nicht erhältlich, aber es ist definitiv kein Bashismus.Shell ist eine Schnittstelle zwischen einem Benutzer und dem Betriebssystem, um auf die Dienste eines Betriebssystems zuzugreifen. Dies kann entweder eine GUI oder eine CLI (Command Line Interface) sein.
sh (Bourne sh ell) ist ein Shell-Befehlszeileninterpreter für Unix / Unix-ähnliche Betriebssysteme. Es bietet einige integrierte Befehle. In der Skriptsprache bezeichnen wir Interpreter als
#!/bin/sh
. Es wurde am häufigsten von anderen Muscheln wie Bash (frei / offen), Kash (nicht frei) unterstützt.Bash ( B ourne a Gain 's Hell) ist ein Shell-Ersatz für die Bourne-Shell. Bash ist eine Obermenge von sh. Bash unterstützt sh. POSIX ist eine Reihe von Standards, die definieren, wie POSIX-kompatible Systeme funktionieren sollen. Bash ist eigentlich keine POSIX-kompatible Shell. In einer Skriptsprache bezeichnen wir den Interpreter als
#!/bin/bash
.Analogie:
quelle
sh
(es ist also eine "Unterklasse" im OOP-Sinne) und erweitert es (hat also eine Obermenge der Funktionalität).Post von UNIX.COM
Shell-Funktionen
In der folgenden Tabelle sind die meisten Funktionen aufgeführt, bei denen Sie meiner Meinung nach eine Shell einer anderen vorziehen würden. Es ist nicht als endgültige Liste gedacht und enthält nicht jedes einzelne mögliche Merkmal für jede einzelne mögliche Shell. Eine Funktion befindet sich nur dann in einer Shell, wenn sie in der mit dem Betriebssystem gelieferten Version enthalten ist oder direkt aus der Standarddistribution kompiliert verfügbar ist. Insbesondere die unten angegebene C-Shell ist die unter SUNOS 4. * verfügbare. Eine beträchtliche Anzahl von Anbietern liefert jetzt entweder tcsh oder stattdessen ihre eigene erweiterte C-Shell aus (sie machen nicht immer deutlich, dass sie tcsh versenden.
Code:
Schlüssel zur obigen Tabelle.
Y Die Funktion kann mit dieser Shell ausgeführt werden.
N Feature ist in der Shell nicht vorhanden.
F Die Funktion kann nur mithilfe des Shells-Funktionsmechanismus ausgeführt werden.
L Die Readline-Bibliothek muss mit der Shell verknüpft sein, um diese Funktion zu aktivieren.
Anmerkungen zur obigen Tabelle
quelle
TERMINAL
SCHALE
SH Vs. BASH
Sch
BASH
REFERENZMATERIAL:
SHELL gnu.org:
BASH gnu.org:
quelle
Andere Antworten wiesen allgemein auf den Unterschied zwischen Bash und einem POSIX-Shell-Standard hin. Wenn Sie jedoch tragbare Shell-Skripte schreiben und an die Bash-Syntax gewöhnt sind, ist eine Liste typischer Bashismen und entsprechender reiner POSIX-Lösungen sehr praktisch. Diese Liste wurde erstellt, als Ubuntu als Standardsystem-Shell von Bash zu Dash wechselte. Sie finden sie hier: https://wiki.ubuntu.com/DashAsBinSh
Darüber hinaus gibt es ein großartiges Tool namens Checkbashisms , das in Ihrem Skript nach Bashismen sucht und nützlich ist, wenn Sie sicherstellen möchten, dass Ihr Skript portabel ist.
quelle
Sie sind fast identisch, haben aber
bash
mehr Funktionen -sh
sind (mehr oder weniger) eine ältere Untergruppe vonbash
.sh
bedeutet oft das OriginalBourne shell
, das älter ist alsbash
(Bourne *again* shell
) ist und 1977 erstellt wurde. In der Praxis ist es jedoch möglicherweise besser, es als eine hoch kreuzkompatible Shell zu betrachten, die dem POSIX-Standard von 1992 entspricht.Skripte, die mit
#!/bin/sh
dersh
Shell beginnen oder diese verwenden, tun dies normalerweise aus Gründen der Abwärtskompatibilität. Jedes Unix / Linux-Betriebssystem hat einesh
Shell. Unter Ubuntu wirdsh
häufig aufgerufendash
und unter MacOS ist es eine spezielle POSIX-Version vonbash
. Diese Schalen können für standardkonformes Verhalten, Geschwindigkeit oder Abwärtskompatibilität bevorzugt werden.bash
ist neuer als das Originalsh
, fügt mehr Funktionen hinzu und versucht, abwärtskompatibel zu seinsh
. Theoretisch solltensh
Programme ausgeführt werdenbash
.bash
ist auf fast allen Linux / Unix-Computern verfügbar und wird normalerweise standardmäßig verwendet - mit der bemerkenswerten Ausnahme, dass MacOSzsh
ab Catalina (10.15) standardmäßig verwendet wird . FreeBSD wird standardmäßig nicht mitbash
installiert.quelle
sh
weit vor POSIX. Heutzutage würden Sie hoffen, dass alles, wassh
Sie finden, mindestens POSIX-kompatibel ist. Auf Legacy-Systemen ist dies jedoch keineswegs selbstverständlich. POSIX standardisiert weit mehr als die Shell; In der Tat könnte man argumentieren, dass die Standardisierung von Betriebssystemaufrufen und Bibliotheksfunktionen wichtiger ist./bin/sh
kann oder kann nicht das gleiche Programm wie aufrufen/bin/bash
.sh
unterstützt mindestens die von POSIX benötigten Funktionen (unter der Annahme einer korrekten Implementierung). Möglicherweise werden auch Erweiterungen unterstützt.bash
Die "Bourne Again Shell" implementiert die Funktionen, die für sh plus bash-spezifische Erweiterungen erforderlich sind. Der vollständige Satz von Erweiterungen ist zu lang, um hier beschrieben zu werden, und variiert mit neuen Versionen. Die Unterschiede sind im Bash-Handbuch dokumentiert. Gebeninfo bash
Sie den Abschnitt "Bash-Funktionen" ein und lesen Sie ihn (Abschnitt 6 in der aktuellen Version) oder lesen Sie die aktuelle Dokumentation online .quelle
sh
Sie erhalten nur dann eine POSIX-Shell, wenn Sie das richtigePATH
Setup in Ihrer aktuellen Shell haben. Es gibt keinen definierten PATH-Namen, der Ihnen eine POSIX-Shell gibt.sh
es nicht unbedingt sogar eine POSIX-Shell, zum Beispiel unter Solaris.Bash und Sh sind zwei verschiedene Shells. Grundsätzlich ist bash sh, mit mehr Funktionen und besserer Syntax. Die meisten Befehle funktionieren gleich, sind jedoch unterschiedlich. Bash (Bash) ist eine von vielen verfügbaren (und dennoch am häufigsten verwendeten) Unix-Shells. Bash steht für "Bourne Again SHell" und ist ein Ersatz / eine Verbesserung der ursprünglichen Bourne Shell (sh).
Shell-Skripte sind Skripte in jeder Shell, während Bash-Skripte speziell für Bash erstellt werden. In der Praxis werden "Shell-Skript" und "Bash-Skript" jedoch häufig synonym verwendet, es sei denn, die betreffende Shell ist nicht Bash.
Allerdings sollten Sie erkennen, dass / bin / sh auf den meisten Systemen eine symbolische Verbindung darstellt und sh nicht aufruft. In Ubuntu / bin / sh, das zum Verknüpfen mit Bash verwendet wurde, ist dies ein typisches Verhalten bei Linux-Distributionen, jetzt wurde jedoch das Verknüpfen mit einer anderen Shell namens dash geändert. Ich würde Bash verwenden, da dies so ziemlich der Standard ist (oder zumindest meiner Erfahrung nach am häufigsten). Tatsächlich treten Probleme auf, wenn ein Bash-Skript #! / Bin / sh verwendet, da der Skript-Hersteller davon ausgeht, dass der Link zu Bash ist, wenn dies nicht erforderlich ist.
quelle
Die Unterschiede sind so einfach wie möglich: Nach einem grundlegenden Verständnis sind die anderen oben veröffentlichten Kommentare leichter zu erfassen.
Shell - "Shell" ist ein Programm, das die Interaktion zwischen dem Benutzer und dem Betriebssystem (Kernel) erleichtert. Es gibt viele Shell-Implementierungen wie sh, bash, csh, zsh ... etc.
Mit jedem der Shell-Programme können wir Befehle ausführen, die von diesem Shell-Programm unterstützt werden.
Bash - Es leitet sich von B ab ourne- a ab Gewinn Sh ell. Mit diesem Programm können wir alle von Shell angegebenen Befehle ausführen. Außerdem können wir einige Befehle ausführen, die speziell zu diesem Programm hinzugefügt wurden. Bash ist abwärtskompatibel mit sh.
Sh - Es stammt von Bourne Sh . "sh" unterstützt alle in der Shell angegebenen Befehle. Mit diesem Programm können wir alle von Shell angegebenen Befehle ausführen.
Weitere Informationen erhalten Sie unter: - https://man.cx/sh - https://man.cx/bash
quelle
Das Linux-Betriebssystem bietet verschiedene Arten von Shell. Obwohl Shells viele Befehle gemeinsam haben, hat jeder Typ einzigartige Funktionen. Lassen Sie uns verschiedene Arten von meist verwendeten Muscheln untersuchen.
Sh Shell:
Sh Shell ist auch als Bourne Shell bekannt. Die Sh-Shell ist die erste Shell, die 1977 von Stephen Bourne in den Bell Labs von AT & T für Unix-Computer entwickelt wurde. Sie enthält viele Skript-Tools.
Bash Shell:
Bash Shell steht für Bourne Again Shell. Die Bash-Shell ist die Standard-Shell in den meisten Linux-Distributionen und ersetzt die Sh-Shell (die Sh-Shell wird auch in der Bash-Shell ausgeführt). Bash Shell kann die überwiegende Mehrheit der Sh-Shell-Skripte ohne Änderungen ausführen und bietet auch eine Funktion zur Bearbeitung von Befehlszeilen.
quelle