ksh y bash son completamente diferentes, pero los binarios bash y sh son en su mayoría idénticos. Sh de OS X es una versión de bash que:
- Tiene modo POSIX habilitado. bash no cumple con POSIX de forma predeterminada.
- Tiene un comportamiento de inicio diferente. Por ejemplo,
sh -l
no lee ~/.bash_profile/
.
- Tiene xpg_echo habilitado de forma predeterminada. Entonces,
echo
actúa como echo -e
y no admite ninguna opción.
El FCEDIT predeterminado 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 se puede descargar desde enlace .
De man bash :
Si se invoca a bash con el nombre sh, intenta imitar el comportamiento de inicio de las versiones históricas de sh lo más cerca posible, a la vez que también cumple con el estándar POSIX.
Aunque no emula otros aspectos de los shells originales de Bourne.
Las shells originales de Bourne ya no se mantienen, y / bin / sh ahora está destinado a ser otra shell que solo cumple con POSIX. El sh de OS X permite usar bashisms que no necesariamente funcionan con / bin / sh en otras plataformas (como el dash en Ubuntu).