Vom Unterschied zwischen Bash und Sh :
AB zur Frage: Wenn Sie
/bin/sh
einen Link zu bash haben, verhält sich bash beim Aufruf nicht so/bin/sh
wie beim Aufruf als/bin/bash
. Wenn es als aufgerufensh
wird, beschränkt es sich hauptsächlich auf POSIX-Konformität sowie eine begrenzte Anzahl von Erweiterungen.
Bedeutet das, dass jedes Mal, wenn ich unter Linux auf ein Shell-Skript mit einem Shebang to Sh stoße: #!/bin/sh
Auch wenn es sich bei dieser Distribution bin/sh
um einen Symlink zu einer anderen Shell wie Dash oder Bash handelt, diese zu 100% mit der Bourne-Shell kompatibel sein sollte, da es beschränkt sich auf eine begrenzte Anzahl von Erweiterungen? Also könnte ich sie in FreeBSD ausführen? Gibt es eine Ausnahme? Oder sollte ich sicher sein, dass es funktionieren wird?
Wenn also in einer Distribution bin/sh
ein Symlink zu bin/bash
und ein Skript verwendet wird #!/bin/sh
und das Skript Bashismus enthält, wird es nicht ausgeführt, da Bash gerne im Sh-Modus ist?
quelle
/bin/sh
als shebang. Ein Shell-Skript kann weiterhin explizit verwendet werden/bin/bash
. Wie auch immer, die meisten Shell-Skripte werden wahrscheinlich unter / bin / sh gut laufen, aber das Problem werden die Benutzerwerkzeuge sein, z. B. erwarten die meisten Shell-Skripte GNU-Userland, was wahrscheinlich eher ein Problem als nur ein Syntaxfehler sein wird. Ich habe auch einen Link zur Bash-Referenz hinzugefügt, der das unterschiedliche Verhalten im Posix-Modus auflistetEs scheint einige Verwirrung um die Bourne-Muschel zu geben. Die Bourne-Shell war vor Jahrzehnten, in den Tagen vor POSIX, eine Unix-Shell. Heutzutage ist "sh" eine Implementierung oder eine andere einer Shell, die die POSIX-Spezifikation implementiert, darunter bash, pdksh, AT & T ksh, neuere Almquist-Shells und deren Derivate, die POSIX-kompatibel gemacht wurden (einschließlich des "sh" einiger BSDs Andere BSDs basieren auf pdksh und Debian ash (dash). Sogar zsh hat einen Modus, in dem es meistens POSIX-konform ist.
Die Bourne-Shell ist nicht POSIX-kompatibel und kann heutzutage auf vielen Systemen nicht gefunden werden. Wo die Bourne-Shell gefunden wird oder wo nicht, gibt es immer ein "sh", das POSIX-kompatibel ist (und nicht die Bourne-Shell), im Allgemeinen,
/bin
während Solaris eine bemerkenswerte (ärgerliche) Ausnahme ist.Beachten Sie, dass vor der Bourne-Shell und vor über 30 Jahren "sh" die Thompson-Shell war. Wir schreiben keine Skripte mehr, die mit der Thompson-Shell kompatibel sind. Ebenso sollten wir aufhören, an "sh" als die Bourne-Shell zu denken.
Jetzt ist "sh" eine Spezifikation, nicht viele manchmal inkompatible Varianten einer Implementierung. Das macht es viel einfacher, tragbare Skripte zu schreiben. Folgen Sie einfach der Spezifikation .
Das gilt für "sh" und alle Standard-Dienstprogramme (sed, cut, tr ...)
quelle
sed -r
. Auf Systemen mit BSD-basierten Dienstprogrammen verwenden Siesed -E
. FreeBSDs sed akzeptiert beide, aber Mac OS X akzeptiert nur-E
. Und so weiter und so fort.\(...\)\1
haben keine Übersetzung in Standard-EREs).\|
BREs nicht berücksichtigt . Ich bin alle dafür, so tragbar wie möglich zu schreiben. Ich habe nur die (ich dachte weithin geschätzte) Beobachtung gemacht, dass dies schmerzhaft sein kann, und manchmal ist das Schreiben an POSIX einfach nicht möglich. Irgendwo gibt es Links, die viele solcher Perversionen aufweisen. wird nach ihnen suchen.${VAR:=stuff...here}
aber viele Shells lassen Sie nicht zu, Sie müssen Anführungszeichen setzenstuff...here
.