7 votos

¿Están los shells Bash, Bourne y Korn compilados en un solo binario en OSX?

En OSX 10.8, si comparas los binarios de bash, sh y ksh, algunas opciones de shell diferentes, tienen el mismo tamaño. Si lo llevas más lejos y cmp los binarios, parece que sólo hay una diferencia de un byte entre los binarios.

Esto superficialmente parece indicar que todo el código para soportar todos los diferentes shells está disponible en cada binario, pero el subconjunto al que tienes acceso depende del shell que termines ejecutando.

  1. ¿Alguien puede confirmar que los binarios están compilados de esta forma?

  2. Desde el punto de vista de Apple, ¿hay alguna ventaja en combinar todas las carcasas de esta manera?

9voto

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

4voto

Creo que tu suposición básica es errónea. Comprobando en 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

Técnicamente hablando, existen algunas similitudes entre sh y bash (y este último también puede comportarse como sh ) pero ksh proviene definitivamente de una base de origen diferente:

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X