Bash, Bourne ve Korn mermileri OSX'te bir ikili dosyaya mı derlendi?


7

OSX 10.8'de, birkaç farklı kabuk seçeneği olan bash, sh ve ksh için ikili dosyaları karşılaştırırsanız, bunlar aynı boyuttadır. Eğer daha ileri götürürseniz ve cmpikili dosyalar, ikili dosyalar arasında sadece tek baytlık bir fark vardır.

Bu yüzeysel olarak, tüm farklı kabukları desteklemek için tüm kodların her bir ikili dosyada mevcut olduğunu, ancak hangi alt kümeye erişebildiğinizi hangi kabuğun yürüttüğünüze bağlı olduğunu gösterir.

  1. İkili dosyaların aslında bu şekilde derlendiğini herkes doğrulayabilir mi?
  2. Apple'ın bakış açısından, tüm mermileri bu şekilde birleştirmenin herhangi bir yararı var mı?

Yanıtlar:


4

Bence temel varsayım yanlış. 10.8.3'te kontrol:

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

Teknik olarak shve arasında bazı benzerlikler vardır bash(ve daha sonra da aynı şekilde davranılabilir sh), ancak kshkesinlikle farklı bir kaynak tabandan geliyor:


Oh evet, kesinlikle haklısın; sadece cmp yerine cmp -l'ye bakmalıydı. Teşekkürler.
nsg

2
İlginçtir ki, / bin / sh aslında olduğu (o adına göre sh-öykünme modunda çalıştırmak edeceğiz rağmen) bash. OS X'in bazı eski sürümlerinde ya / bin / bash için sabit bir bağlantı ya da özdeş bir kopyadır, ancak en azından 10.8.3'te biraz farklıdır. / bin / ksh, diğer taraftan, aynı boyutta olan gerçekten farklı bir programdır.
Gordon Davisson

9

ksh ve bash tamamen farklıdır, ancak bash ve sh ikili dosyaları çoğunlukla aynıdır. OS X's sh, bash'ın bir sürümüdür:

  • Has POSIX modu sağladı. bash varsayılan olarak POSIX ile uyumlu değildir.
  • Farklı başlatma davranışları vardır. Örneğin sh -lokumaz ~/.bash_profile/.
  • Xpg_echo varsayılan olarak etkindir. Yani echoböyle davranır echo -eve herhangi bir seçeneği desteklemez.

Varsayılan FCEDIT sh biçiminde, ancak EDITOR biçiminde veya bash biçiminde düzenlenir:

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

Kaynak http://opensource.apple.com/tarballs/ adresinden indirilebilir .

Gönderen adam bash :

Bash sh adıyla çağrılırsa, POSIX standardına da uyurken, sh'in eski sürümlerinin başlatma davranışını mümkün olduğunca yakından taklit etmeye çalışır.

Orijinal Bourne mermilerinin diğer yönlerini taklit etmiyor.

Orijinal Bourne mermileri artık korunmuyor ve / bin / sh artık sadece POSIX ile uyumlu başka bir mermi anlamına geliyor. OS X's sh , diğer platformlarda / bin / sh ile mutlaka çalışmayan bashisms'lerin kullanılmasına izin verir (Ubuntu'daki tire gibi).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.