sh может означать либо оболочку Bourne, либо /bin /sh, которая является другой (POSIX-совместимой) оболочкой на большинстве современных платформ. "Оболочка POSIX" - это абстрактная оболочка, определенная POSIX, которая реализуется с помощью bash в режиме POSIX или ksh или dash по умолчанию. /bin /sh иногда также называют оболочкой POSIX, потому что это оболочка, которая соответствует POSIX на большинстве платформ. Оригинальные оболочки Bourne не являются оболочками POSIX.
У bashref есть список различий между оболочками bash и Bourne. man bash
есть список изменений, когда bash вызывается в режиме POSIX.
/bin/sh не является символической ссылкой или жесткой ссылкой в OS X, но он почти такого же размера, как /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
человек Баш:
Если bash вызывается с именем sh, он пытается максимально близко имитировать поведение при запуске исторических версий sh, при этом также соответствует стандарту POSIX.
В остальном мимикрирование снарядов Борна довольно ограничено. bash +B
(Bourne) фактически отключил бы такие функции, как расширение скобок.
$ sh
$ echo {a,b}
a b
$ echo $BASH_VERSION
3.2.48(1)-release
$ bash +B
$ echo {a,b}
{a,b}
Но даже если вы отключите режим POSIX, echo ведет себя как echo -e
по умолчанию:
$ sh
$ shopt -uo posix
$ echo '1\b2'
2
/bin/sh - черта в Ubuntu, поэтому некоторые ошибки работают с /bin/sh в OS X, но не в Ubuntu.
Если вы действительно хотите писать сценарии для (что-то вроде) оригинальных оболочек Борна, вы можете использовать #!/usr/bin/env bash +B
вместо этого.
Я думаю, что проще написать сценарии для bash, чем избегать функций, которые не являются частью спецификаций POSIX или оболочек Bourne, или проверять все с помощью других оболочек.