sh może oznaczać powłokę Bourne'a lub / bin / sh, która jest inną powłoką (zgodną z POSIX) na większości nowoczesnych platform. „Powłoka POSIX” to streszczenie powłoka zdefiniowana przez POSIX , który jest implementowany przez bash w trybie POSIX lub domyślnie ksh lub dash. / bin / sh jest czasami nazywany także powłoką POSIX, ponieważ jest to powłoka zgodna z POSIX na większości platform. Oryginalne powłoki Bourne'a nie są powłokami POSIX.
bashref ma listę różnice między powłokami bash i Bourne . man bash
ma listę zmienia się, gdy bash jest wywoływany w trybie POSIX .
/ bin / sh nie jest dowiązaniem symbolicznym ani twardym dowiązaniem w systemie OS X, ale ma prawie taki sam rozmiar jak / 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
człowiek bash :
Jeśli bash jest wywoływany z nazwą sh, próbuje jak najdokładniej naśladować zachowanie uruchamiania wersji historycznych sh, dostosowując się również do standardu POSIX.
Naśladowanie powłok Bourne'a jest poza tym dość ograniczone. bash +B
(Bourne) faktycznie wyłączy funkcje takie jak rozwijanie nawiasów.
$ sh
$ echo {a,b}
a b
$ echo $BASH_VERSION
3.2.48(1)-release
$ bash +B
$ echo {a,b}
{a,b}
Ale nawet jeśli wyłączysz tryb POSIX, echo zachowuje się jak echo -e
domyślnie:
$ sh
$ shopt -uo posix
$ echo '1\b2'
2
/ bin / sh jest kreską Ubuntu , więc trochę bashisms pracuj z / bin / sh na OS X, ale nie na Ubuntu.
Jeśli rzeczywiście chcesz pisać skrypty do (czegoś) oryginalnych powłok Bourne'a, możesz użyć #!/usr/bin/env bash +B
zamiast.
Myślę, że pisanie skryptów dla basha jest łatwiejsze niż unikanie funkcji, które nie są częścią specyfikacji POSIX lub powłok Bourne'a lub testowanie wszystkiego z innymi powłokami.
sh
ibash
): http://en.wikipedia.org/wiki/Comparison_of_command_shells