7 votes

Les shells Bash, Bourne et Korn sont-ils compilés en un seul binaire dans OSX ?

Sous OSX 10.8, si vous comparez les binaires de bash, sh et ksh, quelques options de shell différentes, ils ont la même taille. Si l'on va plus loin et que l'on compare cmp les binaires, il semble qu'il n'y ait qu'un seul octet de différence entre les binaires.

Cela semble indiquer superficiellement que tout le code nécessaire au fonctionnement des différents shells est disponible dans chaque binaire, mais le sous-ensemble auquel vous avez accès dépend du shell que vous exécutez.

  1. Quelqu'un peut-il confirmer que les binaires sont effectivement compilés de cette manière ?

  2. Du point de vue d'Apple, y a-t-il un avantage à combiner toutes les coquilles de cette manière ?

9voto

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).

4voto

nohillside Points 82672

Je pense que votre hypothèse de base est erronée. Vérification sur 10.8.3 :

pse@Fourecks:~$ ls -l $(type -p sh bash ksh)
-r-xr-xr-x  1 root  wheel  1333920 Oct 16  2012 /bin/bash*
-r-xr-xr-x  1 root  wheel  1380304 Oct 16  2012 /bin/ksh*
-r-xr-xr-x  1 root  wheel  1334000 Oct 16  2012 /bin/sh*
pse@Fourecks:~$ cmp -l $(type -p sh bash) | wc -l
cmp: EOF on /bin/bash
 1138124
pse@Fourecks:~$ cmp -l $(type -p sh ksh) | wc -l
cmp: EOF on /bin/sh
 1238180

D'un point de vue technique, il existe des similitudes entre sh y bash (et ce dernier peut également se comporter comme un sh ) mais ksh provient définitivement d'une source différente :

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X