Ksh y bash son completamente diferentes, pero los binarios de bash y sh son casi idénticos. sh de OS X es una versión de bash que:
- Tiene Modo POSIX activado. bash no cumple con POSIX por defecto.
- Tiene un comportamiento de arranque diferente. Por ejemplo
sh -l
no lee ~/.bash_profile/
.
- Tiene xpg_echo activado por defecto. Así que
echo
actúa como echo -e
y no admite ninguna opción.
Por defecto FCEDIT es ed 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 puede descargarse de http://opensource.apple.com/tarballs/ .
En hombre bash :
Si bash se invoca con el nombre sh, intenta imitar el comportamiento de arranque de las versiones históricas de sh lo más fielmente posible, ajustándose también al estándar POSIX.
Sin embargo, no emula otros aspectos de los cartuchos originales de Bourne.
Los shells Bourne originales ya no se mantienen, y /bin/sh ahora se supone que es algún otro shell que sólo cumple con POSIX. sh de OS X permite usar bashismos que no necesariamente funcionan con /bin/sh en otras plataformas (como dash en Ubuntu).