¿Se compilan los shells Bash, Bourne y Korn en un binario en OSX?

7

En OSX 10.8, si compara los binarios para bash, sh y ksh, unas pocas opciones de shell diferentes, son del mismo tamaño. Si lo lleva más lejos y cmp los binarios, parece que solo hay una diferencia de un solo byte entre los binarios.

Esto parece indicar de manera superficial que todo el código para admitir todos los shells diferentes está disponible en cada binario, pero a qué subconjunto tiene acceso depende del shell que termine ejecutando.

  1. ¿Puede alguien confirmar que los binarios están compilados de esta manera?
  2. Desde el punto de vista de Apple, ¿hay algún beneficio para combinar todos los shells de esta manera?
pregunta Nate 20.04.2013 - 18:31

2 respuestas

4

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

Hablando técnicamente, hay algunas similitudes entre sh y bash (y esto último también se puede hacer para comportarse como sh ) pero ksh viene definitivamente de una fuente diferente:

respondido por el nohillside 20.04.2013 - 19:03
9

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

    
respondido por el user495470 20.04.2013 - 23:10

Lea otras preguntas en las etiquetas