Apakah kerang Bash, Bourne, dan Korn dikompilasi menjadi satu biner di OSX?

7

Pada OSX 10.8, jika Anda membandingkan binari untuk bash, sh, dan ksh, beberapa opsi shell yang berbeda, mereka berukuran sama. Jika Anda mengambil lebih jauh dan cmpbinari, tampaknya hanya ada perbedaan satu byte di antara binari.

Dangkal ini tampaknya menunjukkan bahwa semua kode untuk mendukung semua shell yang berbeda tersedia di setiap biner, tetapi subset yang Anda memiliki akses bergantung pada shell yang Anda jalankan.

  1. Adakah yang bisa mengkonfirmasi bahwa binari sebenarnya dikompilasi dengan cara ini?
  2. Dari sudut pandang Apple, apakah manfaatnya menggabungkan semua cangkang dengan cara ini?
nsg
sumber

Jawaban:

4

Saya pikir asumsi dasar Anda salah. Memeriksa 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

Secara teknis ada beberapa kesamaan antara shdan bash(dan kemudian juga dapat dibuat untuk berperilaku seperti sh) tetapi kshsecara definitif berasal dari basis sumber yang berbeda:

nohillside
sumber
Oh ya, Anda pasti benar; seharusnya melihat cmp -l bukan hanya cmp. Terima kasih.
nsg
2
Menariknya, / bin / sh sebenarnya adalah bash (walaupun itu akan berjalan dalam mode emulasi berdasarkan nama). Dalam beberapa versi OS X yang lalu, itu merupakan tautan keras ke / bin / bash atau salinan yang identik, tetapi setidaknya dalam 10.8.3 itu sedikit berbeda. / bin / ksh, di sisi lain, adalah program yang benar-benar berbeda dengan ukuran yang sama.
Gordon Davisson
9

ksh dan bash benar-benar berbeda, tetapi biner bash dan sh sebagian besar identik. OS X's sh adalah versi bash yang:

  • Apakah mode POSIX diaktifkan. bash tidak mematuhi POSIX secara default.
  • Memiliki perilaku startup yang berbeda. Misalnya sh -ltidak membaca ~/.bash_profile/.
  • Apakah xpg_echo diaktifkan secara default. Jadi echobertingkah seperti echo -edan tidak mendukung opsi apa pun.

FCEDIT default adalah ed di sh tetapi EDITOR atau ed di 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}}"

Sumber dapat diunduh dari http://opensource.apple.com/tarballs/ .

Dari man bash :

Jika bash dipanggil dengan nama sh, ia mencoba untuk meniru perilaku startup versi historis sh sedekat mungkin, sementara menyesuaikan dengan standar POSIX juga.

Itu tidak meniru aspek lain dari kulit Bourne asli.

Shell Bourne asli tidak lagi dipertahankan, dan / bin / sh sekarang dimaksudkan untuk menjadi beberapa shell lain yang hanya sesuai dengan POSIX. OS X's sh memungkinkan penggunaan bashisms yang tidak selalu berfungsi dengan / bin / sh pada platform lain (seperti dash pada Ubuntu).

Lri
sumber