Le shell Bash, Bourne e Korn sono compilate in un binario in OSX?


7

Su OSX 10.8, se si confrontano i binari per bash, sh e ksh, alcune opzioni di shell diverse, hanno le stesse dimensioni. Se lo prendi oltre e cmpi binari, sembra esserci solo una differenza a byte singolo tra i binari.

Questo sembra superficialmente indicare che tutto il codice per supportare tutte le diverse shell è disponibile in ogni binario, ma a quale sottoinsieme si ha accesso dipende da quale shell si sta eseguendo.

  1. Qualcuno può confermare che i binari sono effettivamente compilati in questo modo?
  2. Dal punto di vista di Apple, i loro vantaggi sono combinare tutti i gusci in questo modo?

Risposte:


4

Penso che il tuo presupposto di base sia sbagliato. Verifica su 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 parlando ci sono alcune somiglianze tra she bash(e anche i successivi possono comportarsi in modo simile sh) ma kshprovengono definitivamente da una base di fonti diversa:


Oh sì, hai decisamente ragione; avrebbe dovuto guardare cmp -l piuttosto che solo cmp. Grazie.
nsg

2
È interessante notare che / bin / sh in realtà è bash (anche se verrà eseguito in modalità sh-emulation in base al nome). In alcune versioni precedenti di OS X è stato o un collegamento reale a / bin / bash o una copia identica, ma almeno in 10.8.3 è leggermente diverso. / bin / ksh, d'altra parte, è un programma veramente diverso che sembra avere le stesse dimensioni.
Gordon Davisson,

9

ksh e bash sono completamente diversi, ma i binari bash e sh sono per lo più identici. SH di OS X è una versione di bash che:

  • La modalità POSIX è abilitata. bash non è conforme a POSIX per impostazione predefinita.
  • Ha un comportamento di avvio diverso. Ad esempio sh -lnon legge ~/.bash_profile/.
  • Xpg_echo è abilitato per impostazione predefinita. Quindi si echocomporta come echo -ee non supporta alcuna opzione.

Il valore predefinito FCEDIT è editato in sh ma EDITOR o ed in 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 fonte può essere scaricata da http://opensource.apple.com/tarballs/ .

Da man bash :

Se bash viene invocato con il nome sh, cerca di imitare il comportamento di avvio delle versioni storiche di sh il più vicino possibile, pur essendo conforme allo standard POSIX.

Tuttavia, non emula altri aspetti delle shell Bourne originali.

Le shell Bourne originali non vengono più mantenute e / bin / sh ora è pensato per essere qualche altra shell che è conforme a POSIX. Lo sh di OS X consente l'uso di bashismi che non funzionano necessariamente con / bin / sh su altre piattaforme (come dash su Ubuntu).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.