なぜそんなに多くの「sh互換」シェルがあるのですか?
Bourneシェルは、最初に公にの一環として、1979年に発売されたのUnix V7。ほとんどすべてのUnixおよびUnixライクなシステムは、V7 Unixから派生しているので、たとえ精神的なものであっても、Bourneシェルは「永遠に」私たちと共にあります¹。
Bourneシェルは実際には以前のシェルを置き換え、Thompsonシェルをレトロニードしましたが、Unixの歴史の早い段階で起こったため、今日ではほとんど忘れられています。Bourneシェルは、Thompsonシェルのスーパーセットです。²
ボーンシェルとトンプソンシェルの両方が呼ばれましたsh
。POSIXによって指定されたシェルはとも呼ばれますsh
。そのため、誰かがsh
-compatible と言うとき、彼らはこの一連のシェルを手で振って言及しています。具体的になりたい場合は、「POSIXシェル」または「ボーンシェル」と言います。³
POSIXシェルは1988年バージョンに基づいてKornシェル順番に飛び越す、AT&TのUnix上でBourneシェルを置き換えることを意図して、BSD Cシェルを限りfeatures.⁴の面でksh
最も、POSIXシェルの祖先でありますUnixおよびUnixライクシステムには、現在Kornシェルのバリアントが含まれています。例外は通常、小さな組み込みシステムであり、完全なPOSIXシェルが占有するスペースを確保することはできません。
とは言うものの、Kornシェルは、POSIXシェルとは異なるものとして、商用のUnixの世界以外では実際に普及することはなかった。これは、その増加が初期のUnix商業化に対応していたため、Unix戦争に巻き込まれたためです。BSD UnixesはCシェルを支持せず、ソースコードはLinuxの開始時に自由に使用できませんでした。⁵初期のLinuxディストリビューターがLinuxカーネルに対応するコマンドシェルを探していたとき、彼らは通常、あなたが話している互換性のあるGNU Bashの 1つを選択しましたsh
。⁶
LinuxとBashの間の初期の関連性はかなり含む他の多くのシェルの運命を密封しksh
、csh
そしてtcsh
。今日でもこれらのシェルを使用しているダイハードはいますが、それらは非常に少数です。re
すべてのこの歴史のような相対後発の理由クリエイターを説明しbash
、zsh
、およびyash
それらを作ることにしましたsh
互換:ボーン/ POSIX互換性は、Unixライクなシステムのためのシェルが広く採用さを得るために提供しなければならない最小です。
多くのシステムでは、デフォルトの対話型コマンドシェルと/bin/sh
は別のものです。/bin/sh
多分:
元のBourneシェル。これは、Solaris 10(2005年にリリースされた)などの古いUNIX®システムとその前身でよく見られます。⁸
POSIX認定シェル。これは、Solaris 11(2010)などの新しいUNIX®システムで一般的です。
Almquistシェル。これは、1989年にUsenetで最初にリリースされたオープンソースのBourne / POSIXシェルクローンであり、AT&Tソースコードを含まない最初のBSDリリース4.4BSD-Liteに含めるためにバークレーのCSRGに提供されました。Almquistシェルは、としてインストールされている場合でも、よく呼び出されます。ash
/bin/sh
4.4BSD-Liteはすべての最新のBSD派生物のベースになり、/bin/sh
そのほとんどがAlmquist派生物として残りましたが、以下に示す1つの大きな例外があります。NetBSDおよびFreeBSDのソースコードリポジトリで、この直接の子孫を確認できます。これらは、1日目からAlmquistシェル派生物を出荷していました。
ash
BSDの世界には、2つの重要な分岐点があります。
dash
、デフォルトの実装として2006年にDebianとUbuntuで有名に採用さ/bin/sh
れました。(BashはDebian派生物のデフォルトの対話型コマンドシェルのままです。)
BusyBoxのash
コマンドは、組み込みLinuxで頻繁に使用され、実装に使用される場合があります。これは後日であり、Debianの古いパッケージから派生したものなので、BusyBox内のコマンド名にもかかわらず、の代わりに派生物と見なすことにしました。/bin/sh
dash
ash
dash
ash
(BusyBoxには、ash
呼ばれるものよりも機能性の低い代替物も含まれていhush
ます。通常ash
、既定ではBusyBoxバイナリに2つのうち1つだけが組み込まれますがhush
、スペースが非常に狭い場合/bin/sh
。BusyBoxベースのシステムは常にdash
似ていません)
GNU Bash として呼び出されると、ほとんどの非POSIX拡張sh
を無効にします。
この選択は、Debianおよびその派生物を除き、Linuxのデスクトップおよびサーバーのバリアントで一般的です。2003年にリリースされたPanther以降、Mac OS Xもこれを行っています。
ksh93
OpenBSDのようなPOSIX拡張を備えたシェル。OpenBSDシェルはsh
、asとして呼び出されたときにBourneおよびPOSIXシェルとの構文およびセマンティックの非互換性を回避するために動作を変更しますが、古いシェルと競合しない純粋な拡張機能を無効にしません。
これは一般的ではありません。のksh93
機能を期待しないでください/bin/sh
。
上記の「シェルスクリプト」は、Bourne / POSIXシェルスクリプトを意味する一般的な用語として使用しました。これは、Bourneファミリーシェルの遍在によるものです。他のシェルでのスクリプト作成について話すには、「C shell script」などの修飾子を指定する必要があります。でもCファミリーシェルはデフォルトで対話型シェルであるシステムでは、より良いスクリプトのためのBourneシェルを使用します。
ウィキペディアがUnixシェルを分類すると、それらはBourneシェル互換、Cシェル互換、および「その他」にグループ化されることを伝えています。
この図は次の場合に役立ちます。
(SVGバージョン、31 kBをクリックするか、フルサイズのPNGバージョン、218 kBを表示します。)
「sh incompatible」とはどういう意味ですか?
sh
互換性のないことについて話す人は通常、次の3つのことのいずれかを意味します。
それらは、それらの「他の」シェルの1つを指しています。⁹
彼らは、BourneとCシェルファミリを区別しています。
彼らは、他のすべてのBourneファミリーシェルにはない、1つのBourneファミリーシェルの特定の機能について話しています。ksh93
、bash
とzsh
特に年上の「標準」のシェルには存在していない多くの機能を持っています。これら3つは、共有POSIX / ksh88
ベースを超えると、多くの点で相互に互換性がありません。
#!/bin/sh
シェバン行を先頭に持つシェルスクリプトを記述するが、その内部でBashまたはKornシェル拡張を使用するのは古典的なエラーです。以来/bin/sh
非常に多くのシステムで、これらの日に上記のKorn / POSIX家族図の殻の一つであり、そのようなスクリプトは、彼らが上で書かれているシステム上で動作しますが、その後のシステムで失敗する/bin/sh
シェルの広いボーンファミリーからのものです。ベストプラクティスは、スクリプトがそのような拡張機能を使用している場合は、行を使用する#!/bin/bash
か、#!/bin/ksh
シェバン行にすることです。
特定のBourneファミリシェルスクリプトが移植可能かどうかを確認する方法は多数あります。
なぜ違うのですか?
同じ理由で、すべて「新規&改良!」状況は異なります:
改善されたバージョンは、後方互換性を壊すことによってのみ改善できました。
誰かが何かが機能するための別の方法を考えました。彼らはそれが好きですが、それは古いものと同じではありませんでした。
誰かが古い標準を完全に理解せずに再実装しようとしたため、混乱して意図しない違いが生じました。
脚注と補足:
BSD Unixの初期バージョンは、V6 Unix用の単なるアドオンソフトウェアコレクションでした。BourneシェルはV7までAT&T Unixに追加されなかったため、BSDは技術的にはBourneシェルの使用を開始しませんでした。Thompsonシェルの原始的な性質に対するBSDの回答はCシェルでした。
それにもかかわらず、BSDの最初のスタンドアロンバージョン(2.9BSDおよび3BSD)はV7またはその移植可能な後継UNIX / 32Vに基づいていたため、Bourneシェルが含まれていました。
(2BSDラインはデジタルのためのBSDの並列フォークになっPDPのミニコンピュータ 3BSDと4BSDの線のような新しいコンピュータの種類を利用するようになった一方で、VaxenとUnixのワークステーション 2.9BSDは、本質的に4.1cBSDのPDPのバージョンだった。彼らがいました同時期、および共有コード VAXが到着したとき。PDPはただ消えていなかったので、2BSDラインがされ、まだ よろめき歩く に沿って。)
Bourneシェルは、1983年までにUnixの世界のいたるところにあったと言っても差し支えありません。これは、コンピューティング業界の「永久に」近似値です。MS-DOSは、その年の階層のファイルシステムだ(!AWWW、どのようcuuute)をし、最初の24ビットのMacintoshのその9" B&W画面で-ない文字通りグレー、黒と白 -来年初めまでは出てこないでしょう。
トンプソンシェルは、今日の標準では非常に原始的でした。これは、今日のスクリプトプログラミング環境ではなく、インタラクティブなコマンドシェルにすぎません。パイプやI / Oリダイレクトのようなものがありましたが、これは典型的には「Unixシェル」の一部と考えられるため、MS-DOSコマンドシェルはUnixから取得するものと考えています。
BourneシェルはPWBシェルも置き換えました。これにより、プログラム可能性(if
、switch
およびwhile
)や初期の環境変数などの重要な要素がThompsonシェルに追加されました。PWBシェルは、あらゆるバージョンのUnixの一部ではなかったため、Thompsonシェルほど記憶に残りません。
誰かが POSIX対Bourneシェルの互換性について具体的に説明していない場合、彼らが意味することのできるすべての範囲があります。
極端な場合、彼らは1979年のBourneシェルをベースラインとして使用できます。「sh
この意味での互換スクリプトは、」本当のBourneシェルまたはその後継とクローンのいずれかで完全に実行することが予想されることを意味します:ash
、bash
、ksh
、zsh
、など
他の極端な人は、代わりにPOSIXによって指定されたシェルをベースラインとして想定します。最近では多くのPOSIXシェル機能を「標準」として採用しているため、組み込みの算術演算、ジョブ制御、コマンド履歴、エイリアス、コマンドライン編集、$()
コマンド形式など、Bourneシェルには実際には存在しないことを忘れがちです。置換など
Kornシェルのルーツは1980年代初期に遡りますが、AT&Tは1988年のSystem Vリリース4までUnixで出荷しませんでした。非常に多くの商用UnixがSVR4に基づいているためksh
、 1980年代後半以降。
(SVR3以前に基づいたいくつかの奇妙なUnixフレーバーは、SVR4のリリース後も市場の一部を保持していましたが、革命が起こったとき、壁に対して最初のものでした。)
1988年は、Kornシェルベースの「POSIXシェル」で最初のPOSIX標準が発表された年でもあります。その後、1993年にKornシェルの改良版がリリースされました。POSIXので、効果的な場所にある元、釘付けksh
:2つのメジャーバージョンにフォークをksh88
し、ksh93
その割りに関与年にちなんで名付けられ、。
ksh88
POSIX互換ではありませんが、違いはわずかですが、ksh88
シェルの一部のバージョンはPOSIX互換になるようにパッチが適用されています。(これは、Dr。G . Korn博士とのスラッシュドットに関する興味深いインタビューからです。はい、シェルを書いた人です。)
ksh93
あるPOSIXシェルの完全互換スーパーセット。プライマリソースリポジトリがAT&T からGitHubに移行して以来、開発ksh93
は散発的でしたが、最新のリリースはこの記事を書いている時点で約3年、ksh93vです。(プロジェクトのベース名は、1993年以降のリリースバージョンを示すためにサフィックスが追加されたままです。)ksh93
KornシェルをPOSIXシェルとは別のものとして含むシステムでは、通常はとして使用可能になりますが/bin/ksh
、場合によっては他の場所に隠れています。
ksh
名前またはKornシェルについて説明するときksh93
、後方互換のBourneおよびPOSIXシェルサブセットと区別する機能について説明します。ksh88
今日、純粋な人にめったに出会うことはありません。
AT&Tは、2000年3月まで Kornシェルのソースコードの所有権を保持していました。その時点までに、LinuxとGNU Bashの関係は非常に強かった。Bashとksh93
それぞれには、他に比べて利点がありますが、現時点では慣性によりLinuxはBashと密接に関連しています。
初期のLinuxベンダーは、最も一般的にオーバーGNU Bashの選択理由としてpdksh
、だった Linuxが始めるされた時点で利用可能に、私は、ユーザーランドの残りのあまりにもから来たので、それはだと思うだろうGNUプロジェクト。Bashのpdksh
開発者はKornシェル機能のコピーに制限されていないため、Bashはやや高度です。
pdksh
AT&Tが真のKornシェルにソースコードをリリースした頃、作業は停止しました。ただし、メンテナンスされている2つの主要なフォークがあります。OpenBSDpdksh
とMirBSD Korn Shellですmksh
。
mksh
Cygwin用に現在パッケージ化されている唯一のKornシェル実装であることが興味深いと思います。
GNU Bashは多くの点でPOSIXを超えていますが、より純粋なPOSIXモードで実行するように要求できます。
csh
/ tcsh
は通常、1990年代初期までのBSD Unixのデフォルトの対話型シェルでした。
BSDバリアントであるMac OS Xの初期バージョンは、Mac OS X 10.2 "Jaguar"を介してこのようになりました。OS Xは、OS X 10.3 "Panther"でデフォルトのシェルtcsh
をBashに切り替えました。この変更は、10.2以前からアップグレードされたシステムには影響しませんでした。これらの変換されたシステム上の既存のユーザーは、シェルを保持していました。tcsh
FreeBSD はまだtcsh
デフォルトシェルとして使用すると主張していますが、FreeBSD 10 VMでは、デフォルトシェルはPOSIX互換のAlmquistシェルバリアントの 1つであるように見えます。NetBSDでも同様です。
OpenBSDはpdksh
代わりにforkをデフォルトのシェルとして使用します。
LinuxとOS Xの人気の高まりにより、FreeBSDがBashに移行することを望んでいる人もいますが、哲学的な理由ですぐにそうなることはありません。気になる場合は、簡単に切り替えることができます。
/bin/sh
最近のように、真にバニラのボーンシェルを備えたシステムを見つけることはまれです。互換性テストのために、それに十分近いものを見つけるために邪魔にならないようにしなければなりません。
私は、現代のコンピュータ上で本物の1979年ヴィンテージBourneシェルを実行するための唯一の方法を知っている:使用古代UnixのV7のでディスクイメージをSIMH PDP-11シミュレータからコンピュータ歴史シミュレーションプロジェクト。SIMHは、Unixライクなコンピュータだけでなく、ほとんどすべての最新のコンピュータで実行されます。SIMH はAndroidおよびiOSでも動作します。
OpenSolarisの、SunはオープンソースのBourneシェルのSVR4のバージョンを初めて。それ以前は、BourneシェルのV7以降のバージョンのソースコードは、Unixソースコードライセンスを持っている人だけが利用できました。
そのコードは、いくつかの異なるソースからの機能しなくなったOpenSolarisプロジェクトの他の部分とは別に利用可能になりました。
最も直接的なソースは、Heirloom Bourne shellプロジェクトです。これは、OpenSolarisの最初の2005リリースの直後に利用可能になりました。移植性とバグ修正作業の一部は今後数か月にわたって行われましたが、プロジェクトの開発は中止されました。
JörgSchillingはosh
、彼のSchily Toolsパッケージと同様に、このコードのバージョンをより適切に管理しています。詳細については、上記を参照してください。
2005年のソースコードリリースから派生したこれらのシェルには、マルチバイト文字セットのサポート、ジョブ制御、シェル関数、および元の1979 Bourneシェルにはないその他の機能が含まれていることに注意してください。
オリジナルのBourneシェルを使用しているかどうかを確認する1つの方法は、Thompsonシェルからの移行を容易にするために追加された文書化されていない機能をサポートしているかどうかを確認することです:^
のエイリアスとして|
。つまり、次のようなコマンドls ^ more
はKornまたはPOSIXタイプのシェルではエラーを返しますがls | more
、実際のBourneシェルでは同じように動作します。
時折、あなたはfish
、scsh
またはrc/es
アドヒアランスに遭遇しますが、それらはCシェルファンよりもまれです。
rc
シェルのファミリーはUnix / Linuxシステムでは一般的に使用されませんが、ファミリーは歴史的に重要であり、それが上記の図で位置を獲得した方法です。Bell Labsのオペレーティングシステム設計に関する継続的な研究の一環として作成された、第10版Unixの後継の一種であるBell Labsオペレーティングシステムrc
のPlan 9の標準シェルです。プログラミングレベルでは、BourneとCシェルの両方と互換性がありません。おそらくそこに教訓があるでしょう。
の最もアクティブなバリアントは、Byby RakitzisによるUnix クローンに基づいたToby Goodwinによって管理されrc
ているバリアントのようです。rc
sh
)と互換性のある(実行可能な)構文を使用するかどうかを指します。別のシェルについては、そのシェルがBourneシェルスクリプトを実行できるかどうかを指します。