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

7

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

Questo superficialmente sembra indicare che tutto il codice per supportare tutti i diversi shell è disponibile in ogni binario, ma quale sottoinsieme a cui si ha accesso dipende da quale shell si finisce per eseguire.

  1. Qualcuno può confermare che i binari siano di fatto compilati in questo modo?
  2. Dal punto di vista di Apple, è il loro vantaggio nel combinare tutte le shell in questo modo?
posta Nate 20.04.2013 - 18:31
fonte

2 risposte

4

Penso che la tua ipotesi di base sia sbagliata. 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 sh e bash (e anche in seguito si può comportarsi come sh ) ma ksh proviene in modo definitivo da una diversa base di origine:

risposta data 20.04.2013 - 19:03
fonte
9

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

  • Ha la modalità POSIX abilitata. bash non è conforme a POSIX per impostazione predefinita.
  • Ha un comportamento di avvio diverso. Ad esempio sh -l non legge ~/.bash_profile/ .
  • Ha abilitato xpg_echo per impostazione predefinita. Quindi echo si comporta come echo -e e non supporta alcuna opzione.

L'impostazione predefinita di FCEDIT è ma 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 dal link .

Da man bash :

If bash is invoked with the name sh, it tries to mimic the startup behavior of historical versions of sh as closely as possible, while conforming to the POSIX standard as well.

Tuttavia non emula altri aspetti delle shell Bourne originali.

Le shell Bourne originali non sono più mantenute e / bin / sh ora è pensato per essere un'altra shell che sia conforme a POSIX. OS X's sh consente di utilizzare i bashisms che non necessariamente funzionano con / bin / sh su altre piattaforme (come dash su Ubuntu).

    
risposta data 20.04.2013 - 23:10
fonte

Leggi altre domande sui tag