O ksh e o bash são completamente diferentes, mas os binários bash e sh são praticamente idênticos. O sh do OS X é uma versão do bash que:
- O modo POSIX está ativado. o bash não está em conformidade com o POSIX por padrão.
- Tem um comportamento de inicialização diferente. Por exemplo
sh -l
, não lê ~/.bash_profile/
.
- O xpg_echo está ativado por padrão. Então,
echo
age como echo -e
e não suporta nenhuma opção.
O FCEDIT padrão é ed em sh, mas EDITOR ou ed em 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}}"
A fonte pode ser baixada em http://opensource.apple.com/tarballs/ .
De man bash :
Se o bash for chamado com o nome sh, ele tentará imitar o comportamento de inicialização das versões históricas do sh o mais próximo possível, além de estar em conformidade com o padrão POSIX.
Porém, ele não emula outros aspectos das conchas Bourne originais.
Os shells Bourne originais não são mais mantidos, e / bin / sh agora deve ser outro shell que apenas cumpre o POSIX. O sh do OS X permite o uso de basismos que não necessariamente funcionam com o / bin / sh em outras plataformas (como o traço no Ubuntu).