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
(Борн) фактически отключил бы такие функции, как расширение фигурных скобок.
$ sh
$ echo {a,b}
a b
$ echo $BASH_VERSION
3.2.48(1)-release
$ bash +B
$ echo {a,b}
{a,b}
Но даже если вы отключите режим POSIX, эхо ведет себя как 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, или проверять все с помощью других оболочек.
sh
иbash
): http://en.wikipedia.org/wiki/Comparison_of_command_shells