Ksh et bash sont complètement différents, mais les binaires bash et sh sont pratiquement identiques. Le sh d'OS X est une version de bash qui :
- A Mode POSIX activée. bash n'est pas conforme à POSIX par défaut.
- A un comportement différent au démarrage. Par exemple
sh -l
ne lit pas ~/.bash_profile/
.
- xpg_echo est activé par défaut. Il s'agit donc d'un
echo
agit comme echo -e
et il ne prend en charge aucune option.
Par défaut, FCEDIT est ed dans sh mais EDITOR ou ed dans 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 source peut être téléchargée à partir de http://opensource.apple.com/tarballs/ .
De man bash :
Si bash est invoqué avec le nom sh, il essaie d'imiter le plus fidèlement possible le comportement au démarrage des versions historiques de sh, tout en se conformant à la norme POSIX.
En revanche, il ne reproduit pas d'autres aspects des coquilles originales de Bourne.
Les shells Bourne originaux ne sont plus maintenus, et /bin/sh est maintenant censé être un autre shell qui se conforme simplement à POSIX. Le sh d'OS X permet d'utiliser bashismes qui ne fonctionnent pas nécessairement avec le /bin/sh sur d'autres plateformes (comme dash sur Ubuntu).