Bash、Bourne、KornシェルはOSXで1つのバイナリにコンパイルされますか?


7

OSX 10.8では、bash、sh、およびkshのバイナリといくつかの異なるシェルオプションを比較すると、それらは同じサイズです。さらにそれとcmpバイナリを見ると、バイナリ間には1バイトの違いしかないようです。

これは表面的には、さまざまなシェルのすべてをサポートするすべてのコードが各バイナリで使用できることを示しているようですが、アクセスできるサブセットは、実行するシェルによって異なります。

  1. 誰かがバイナリが実際にこのようにコンパイルされていることを確認できますか?
  2. Appleの観点から見ると、この方法ですべてのシェルを組み合わせる利点はありますか?

回答:


4

あなたの基本的な仮定は間違っていると思います。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

技術的には、との間にいくつかの類似点がshありますbash(そして、後者ものように動作させることができますsh)がksh、最終的には別のソースベースからのものです。


そうそう、あなたは間違いなく正しい。cmpだけでなく、cmp -lを表示しているはずです。ありがとう。
nsg 2013

2
興味深いことに、/ bin / shは実際に bashです(ただし、名前に基づいてshエミュレーションモードで実行されます)。以前のバージョンのOS Xでは、これは/ bin / bashへのハードリンクまたは同一のコピーでしたが、少なくとも10.8.3ではわずかに異なります。一方、/ bin / kshは、たまたま同じサイズのまったく異なるプログラムです。
Gordon Davisson

9

kshとbashは完全に異なりますが、bashとshのバイナリはほとんど同じです。OS Xのshはbashのバージョンで、次のことを行います。

  • POSIXモードが有効になって。bashはデフォルトではPOSIXに準拠していません。
  • 起動時の動作が異なります。たとえば、sh -lは読みません~/.bash_profile/
  • xpg_echoがデフォルトで有効になっています。のechoようecho -eに動作し、オプションをサポートしていません。

デフォルトのFCEDITはshで編集されていますが、EDITORまたは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}}"

ソースはhttp://opensource.apple.com/tarballs/からダウンロードできます。

man bashから:

bashがshという名前で呼び出された場合、POSIX標準にも準拠しながら、shの過去のバージョンの起動時の動作をできるだけ模倣しようとします。

ただし、オリジナルのBourneシェルの他の側面はエミュレートしません。

元のBourneシェルは維持されなくなり、/ bin / shはPOSIXに準拠する他のシェルになるようになりました。OS Xのshでは、他のプラットフォーム(Ubuntuのダッシュのような)で/ bin / shと必ずしも連動しないバシズムを使用できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.