ksh и bash совершенно разные, но двоичные файлы bash и sh в основном идентичны. OS X's sh - это версия bash, которая:
- Имеет режим POSIX включен. bash не соответствует POSIX по умолчанию.
- Имеет другое поведение при запуске. Например
sh -l
не читает ~/.bash_profile/
.
- Xpg_echo включен по умолчанию. Так
echo
действует echo -e
и не поддерживает никаких опций.
FCEDIT по умолчанию - ed в sh, но EDITOR или ed в bash:
$ diff -y --suppress-common-lines -W 80 <(strings /bin/bash) <(strings /bin/sh)
> /bin/bash
${FCEDIT:-${EDITOR:-ed}} | ${FCEDIT:-ed}
@(#)PROGRAM:bash PROJECT:bash-86.1 | @(#)PROGRAM:sh PROJECT:bash-86.1
$ grep -rF '${FCEDIT:-${EDITOR:-ed}}' ~/Code/Source/bash-86.1/
bash-86.1/bash-3.2/builtins/fc.c:# define POSIX_FC_EDIT_COMMAND "${FCEDIT:-${EDITOR:-ed}}"
bash-86.1/bash-3.2/builtins/fc.def:# define POSIX_FC_EDIT_COMMAND "${FCEDIT:-${EDITOR:-ed}}"
Источник можно скачать с http://opensource.apple.com/tarballs/ .
От человека Баш :
Если bash вызывается с именем sh, он пытается максимально близко имитировать поведение при запуске исторических версий sh, при этом также соответствует стандарту POSIX.
Это не подражает другим аспектам оригинальных раковин Борна все же.
Оригинальные оболочки Bourne больше не поддерживаются, и теперь / bin / sh - это другая оболочка, которая просто соответствует POSIX. OS X позволяет использовать bashism, которые не обязательно работают с / bin / sh на других платформах (например, dash в Ubuntu).