Werden Bash-, Bourne- und Korn-Shells in OSX zu einer Binärdatei kompiliert?

7

Wenn Sie unter OSX 10.8 die Binärdateien für bash, sh und ksh, einige verschiedene Shell-Optionen, vergleichen, haben sie dieselbe Größe. Wenn Sie weiter gehen und cmpdie Binärdateien, scheint es nur einen Einzelbyte-Unterschied zwischen den Binärdateien zu geben.

Dies scheint oberflächlich darauf hinzudeuten, dass der gesamte Code zur Unterstützung aller verschiedenen Shells in jeder Binärdatei verfügbar ist. Welche Teilmenge Sie jedoch zugreifen können, hängt davon ab, welche Shell Sie am Ende ausführen.

  1. Kann jemand bestätigen, dass die Binärdateien tatsächlich auf diese Weise kompiliert wurden?
  2. Ist es aus Apples Sicht von Vorteil, alle Schalen auf diese Weise zu kombinieren?
nsg
quelle

Antworten:

4

Ich denke, Ihre Grundannahme ist falsch. Überprüfung am 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

Technisch gesehen gibt es einige Ähnlichkeiten zwischen shund bash(und das letztere kann auch dazu gebracht werden, sich so zu verhalten sh), kommt aber kshdefinitiv von einer anderen Quellenbasis:

nohillside
quelle
Oh ja, du hast definitiv recht; hätte eher auf cmp -l als nur auf cmp schauen sollen. Vielen Dank.
nsg
2
Interessanterweise / bin / sh tatsächlich ist bash (obwohl es in sh-Emulationsmodus basierend auf dem Namen ausgeführt werden). In einigen früheren Versionen von OS X war es entweder eine feste Verbindung zu / bin / bash oder eine identische Kopie, aber zumindest in 10.8.3 ist es etwas anders. / bin / ksh hingegen ist ein wirklich anderes Programm, das zufällig ungefähr die gleiche Größe hat.
Gordon Davisson
9

ksh und bash sind völlig unterschiedlich, aber die Bash- und sh-Binärdateien sind größtenteils identisch. OS X's sh ist eine Version von bash, die:

  • Hat den POSIX-Modus aktiviert. bash entspricht standardmäßig nicht POSIX.
  • Hat ein anderes Startverhalten. Zum Beispiel sh -lliest nicht ~/.bash_profile/.
  • Ist xpg_echo standardmäßig aktiviert? So echowirkt wie echo -eund es keine Optionen unterstützen.

Der Standard-FCEDIT ist in sh, aber EDITOR oder in bash angegeben:

$ 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}}"

Die Quelle kann von http://opensource.apple.com/tarballs/ heruntergeladen werden .

Von Mann schlagen :

Wenn bash mit dem Namen sh aufgerufen wird, wird versucht, das Startverhalten historischer Versionen von sh so genau wie möglich nachzuahmen und dabei auch dem POSIX-Standard zu entsprechen.

Es emuliert jedoch keine anderen Aspekte der ursprünglichen Bourne-Muscheln.

Die ursprünglichen Bourne-Shells werden nicht mehr beibehalten, und / bin / sh soll nun eine andere Shell sein, die nur POSIX entspricht. Mit OS X sh können Bashismen verwendet werden , die auf anderen Plattformen (wie Dash unter Ubuntu) nicht unbedingt mit / bin / sh funktionieren.

Lri
quelle