Оболочки Bash, Bourne и Korn скомпилированы в один двоичный файл в OSX?

7

В OSX 10.8, если вы сравните двоичные файлы для bash, sh и ksh, несколько разных параметров оболочки, они имеют одинаковый размер. Если вы возьмете это дальше и cmpдвоичные файлы, то, похоже, будет разница только в один байт между двоичными файлами.

Кажется, это поверхностно указывает на то, что весь код для поддержки всех различных оболочек доступен в каждом двоичном файле, но то, к какому подмножеству у вас есть доступ, зависит от того, какую оболочку вы в итоге выполняете.

  1. Кто-нибудь может подтвердить, что двоичные файлы на самом деле скомпилированы таким образом?
  2. С точки зрения Apple, есть ли у них какое-либо преимущество в объединении всех оболочек таким образом?
NSG
источник

Ответы:

4

Я думаю, что ваше основное предположение неверно. Проверка на 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

Технически говоря, между shи есть некоторые сходства bash(и последнее также можно заставить вести себя как sh), но kshоно определенно исходит из другой исходной базы:

Nohillside
источник
Ах да, вы определенно правы; следовало смотреть на cmp -l, а не просто на cmp. Спасибо.
Nsg
2
Интересно, что / bin / sh на самом деле является bash (хотя он будет работать в режиме эмуляции sh в зависимости от имени). В некоторых прошлых версиях OS X это была либо жесткая ссылка на / bin / bash, либо идентичная копия, но по крайней мере в 10.8.3 она немного отличалась. С другой стороны, / bin / ksh - это действительно другая программа, размер которой примерно одинаков.
Гордон Дэвиссон
9

ksh и bash совершенно разные, но двоичные файлы bash и sh в основном идентичны. OS X's sh - это версия bash, которая:

  • Имеет режим POSIX включен. bash не соответствует POSIX по умолчанию.
  • Имеет другое поведение при запуске. Например sh -lне читает ~/.bash_profile/.
  • Xpg_echo включен по умолчанию. Так echoдействует echo -eи не поддерживает никаких опций.

FCEDIT по умолчанию - ed в sh, но EDITOR или ed в 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}}"

Источник можно скачать с http://opensource.apple.com/tarballs/ .

От человека Баш :

Если bash вызывается с именем sh, он пытается максимально близко имитировать поведение при запуске исторических версий sh, при этом также соответствует стандарту POSIX.

Это не подражает другим аспектам оригинальных раковин Борна все же.

Оригинальные оболочки Bourne больше не поддерживаются, и теперь / bin / sh - это другая оболочка, которая просто соответствует POSIX. OS X позволяет использовать bashism, которые не обязательно работают с / bin / sh на других платформах (например, dash в Ubuntu).

LRI
источник