ksh y bash son completamente diferentes, pero los binarios bash y sh son en su mayoría idénticos. OS X's sh es una versión de bash que:
- Tiene el modo POSIX habilitado. bash no cumple con POSIX por defecto.
- Tiene un comportamiento de inicio diferente. Por ejemplo
sh -l
no lee ~/.bash_profile/
.
- Tiene xpg_echo habilitado por defecto. Entonces
echo
actúa como echo -e
y no admite ninguna opción.
El FCEDIT predeterminado se edita en sh pero EDITOR o ed en 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}}"
La fuente se puede descargar desde http://opensource.apple.com/tarballs/ .
De man bash :
Si se invoca bash con el nombre sh, intenta imitar el comportamiento de inicio de las versiones históricas de sh lo más fielmente posible, a la vez que se ajusta al estándar POSIX.
Sin embargo, no emula otros aspectos de los proyectiles Bourne originales.
Los shells Bourne originales ya no se mantienen, y / bin / sh ahora está destinado a ser otro shell que simplemente cumple con POSIX. El sh de OS X permite usar bashisms que no necesariamente funcionan con / bin / sh en otras plataformas (como dash en Ubuntu).