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:
$ 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 -e
standardmäß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 +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.
sh
undbash
): http://en.wikipedia.org/wiki/Comparison_of_command_shells