ksh і bash абсолютно різні, але бінарні файли bash і sh в основному однакові. OS X's sh - версія bash, що:
- Має режим POSIX включений. bash за замовчуванням не відповідає POSIX.
- Має різну поведінку при запуску. Наприклад
sh -l
, не читає ~/.bash_profile/
.
- Увімкнено xpg_echo за замовчуванням. Так
echo
діє, echo -e
і він не підтримує жодних варіантів.
FCEDIT за замовчуванням редагується в 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/ .
Від man bash :
Якщо bash викликається назвою sh, він намагається максимально наблизити поведінку до запуску історичних версій sh, дотримуючись стандарт POSIX.
Однак це не імітує інших аспектів оригінальних оболонок Борна.
Оригінальні оболонки Борна більше не підтримуються, і / bin / sh тепер мається на увазі як інша оболонка, яка просто відповідає POSIX. OS X's дозволяє використовувати башизми , які не обов'язково працюють з / bin / sh на інших платформах (наприклад, тире на Ubuntu).