Чи оболонки Bash, Bourne та Korn компілюються в один двійковий файл в OSX?


7

У OSX 10.8, якщо порівнювати бінарні файли для bash, sh та ksh, кілька різних параметрів оболонки, вони однакового розміру. Якщо взяти його далі та cmpбінарні файли, здається, що лише двобайтова різниця між бінарними файлами.

Здається, це поверхово вказує на те, що весь код для підтримки всіх різних оболонок доступний у кожному двійковому коді, але до якого підмножини ви маєте доступ залежить від того, до якої оболонки ви в кінцевому підсумку виконаєте.

  1. Чи може хтось підтвердити, що двійкові файли насправді складаються таким чином?
  2. З точки зору Apple, чи є яка їх користь у поєднанні всіх оболонок таким чином?

Відповіді:


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остаточно походить з іншої джерельної бази:


О так, ви точно маєте рацію; повинен був дивитися на 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 за замовчуванням редагується в 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/ .

Від man bash :

Якщо bash викликається назвою sh, він намагається максимально наблизити поведінку до запуску історичних версій sh, дотримуючись стандарт POSIX.

Однак це не імітує інших аспектів оригінальних оболонок Борна.

Оригінальні оболонки Борна більше не підтримуються, і / bin / sh тепер мається на увазі як інша оболонка, яка просто відповідає POSIX. OS X's дозволяє використовувати башизми , які не обов'язково працюють з / bin / sh на інших платформах (наприклад, тире на Ubuntu).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.