Os shells Bash, Bourne e Korn são compilados em um binário no OSX?

7

No OSX 10.8, se você comparar os binários para bash, sh e ksh, algumas opções diferentes de shell, elas terão o mesmo tamanho. Se você levar adiante e cmpos binários, parece haver apenas uma diferença de um byte entre os binários.

Isso parece superficialmente indicar que todo o código para suportar todos os shells diferentes está disponível em cada binário, mas qual subconjunto você tem acesso depende de qual shell você acaba executando.

  1. Alguém pode confirmar que os binários são de fato compilados dessa maneira?
  2. Do ponto de vista da Apple, há algum benefício em combinar todas as conchas dessa maneira?
nsg
fonte

Respostas:

4

Eu acho que sua suposição básica está errada. Verificando 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

Tecnicamente falando, existem algumas semelhanças entre she bash(e o último também pode ser feito para se comportar como sh), mas kshé definitivamente proveniente de uma base de origem diferente:

nohillside
fonte
Oh sim, você definitivamente está certo; deveria estar olhando cmp -l ao invés de apenas cmp. Obrigado.
Nsg 20/04/2013
2
Curiosamente, / bin / sh é realmente bash (embora seja executado no modo de emulação sh com base no nome). Em algumas versões anteriores do OS X, foi um link físico para / bin / bash ou uma cópia idêntica, mas pelo menos na versão 10.8.3 é um pouco diferente. / bin / ksh, por outro lado, é um programa verdadeiramente diferente que tem aproximadamente o mesmo tamanho.
Gordon Davisson
9

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, echoage como echo -ee 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).

Lri
fonte