「sh互換」とはどういう意味ですか?


63

私は、「sh compatible」というフレーズがシェルに関連して通常使用されるのを見てきました。シェル内から実行される可能性のあるプログラムにも適用されるかどうかはわかりません。

シェルまたは他のプログラムが「sh互換」であることはどういう意味ですか?「sh incompatible」とはどういう意味ですか?

編集:bashとshの違いを尋ねるこの質問は非常に関連性があります: shとbashの違い

「sh互換」であるとはどういうことなのか、まだ直接的な回答が欲しいです。「sh compatible」は「Shell Command Languageを実装する」という意味ですが、なぜ「sh compatible」シェルがそれほど多く、なぜ異なるのでしょうか?


1
シェルスクリプトの場合、そのスクリプトがBourne Shell(sh)と互換性のある(実行可能な)構文を使用するかどうかを指します。別のシェルについては、そのシェルがBourneシェルスクリプトを実行できるかどうかを指します。
HalosGhost 14

シェルの発明者を学びたい場合は、unix.stackexchange.com
questions / 45684 /

回答:


116

なぜそんなに多くの「sh互換」シェルがあるのですか?

Bourneシェルは、最初に公にの一環として、1979年に発売されたのUnix V7。ほとんどすべてのUnixおよびUnixライクなシステムは、V7 Unixから派生しているので、たとえ精神的なものであっても、Bourneシェルは「永遠に」私たちと共にあります¹。

Bourneシェルは実際には以前のシェルを置き換え、Thompsonシェルをレトロニードしましが、Unixの歴史の早い段階で起こったため、今日ではほとんど忘れられています。Bourneシェルは、Thompsonシェルのスーパーセットです。²

ボーンシェルとトンプソンシェルの両方が呼ばれましたshPOSIXによって指定されたシェルはとも呼ばれます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の間の初期の関連性はかなり含む他の多くのシェルの運命を密封しkshcshそしてtcsh。今日でもこれらのシェルを使用しているダイハードはいますが、それらは非常に少数です。re

すべてのこの歴史のような相対後発の理由クリエイターを説明しbashzsh、および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シェル派生物を出荷していました。

    ashBSDの世界には、2つの重要な分岐点があります。

    1. dash、デフォルトの実装として2006年にDebianとUbuntu有名に採用さ/bin/shれました。(BashはDebian派生物のデフォルトの対話型コマンドシェルのままです。)

    2. BusyBoxashコマンドは、組み込みLinuxで頻繁に使用され、実装に使用される場合があります。これは後日であり、Debianの古いパッケージから派生したものなので、BusyBox内のコマンド名にもかかわらず、の代わりに派生物と見なすことにしました。/bin/shdashashdashash

      (BusyBoxには、ash呼ばれるものよりも機能性の低い代替物も含まれていhushます。通常ash、既定ではBusyBoxバイナリに2つのうち1つだけが組み込まれますがhush、スペースが非常に狭い場合/bin/sh。BusyBoxベースのシステムは常にdash似ていません)

  • GNU Bash として呼び出されると、ほとんどの非POSIX拡張sh無効にします

    この選択は、Debianおよびその派生物を除き、Linuxのデスクトップおよびサーバーのバリアントで一般的です。2003年にリリースされたPanther以降、Mac OS Xもこれを行っています。

  • ksh93OpenBSDのようなPOSIX拡張を備えたシェル。OpenBSDシェルはsh、asとして呼び出されたときにBourneおよびPOSIXシェルとの構文およびセマンティックの非互換性を回避するために動作を変更しますが、古いシェルと競合しない純粋な拡張機能を無効にしません。

    これは一般的ではありません。のksh93機能を期待しないでください/bin/sh

上記の「シェルスクリプト」は、Bourne / POSIXシェルスクリプトを意味する一般的な用語として使用しました。これは、Bourneファミリーシェルの遍在によるものです。他のシェルでのスクリプト作成について話すには、「C shell script」などの修飾子を指定する必要があります。でもCファミリーシェルはデフォルトで対話型シェルであるシステムでは、より良いスクリプトのためのBourneシェルを使用します。

ウィキペディアがUnixシェルを分類すると、それらはBourneシェル互換、Cシェル互換、および「その他」にグループ化されることを伝えています。

この図は次の場合に役立ちます。

Unixシェル:Bourne、Korn、POSIX、C、およびrcシェルファミリー

(SVGバージョン、31 kBをクリックするか、フルサイズのPNGバージョン、218 kBを表示します。)

「sh incompatible」とはどういう意味ですか?

sh互換性のないことについて話す人は通常、次の3つのことのいずれかを意味します。

  1. それらは、それらの「他の」シェルの1つを指しています。⁹

  2. 彼らは、BourneとCシェルファミリを区別しています。

  3. 彼らは、他のすべてのBourneファミリーシェルにはない、1つのBourneファミリーシェルの特定の機能について話しています。ksh93bashzsh特に年上の「標準」のシェルには存在していない多くの機能を持っています。これら3つは、共有POSIX / ksh88ベースを超えると、多くの点で相互に互換性がありません。

#!/bin/sh シェバン行を先頭に持つシェルスクリプトを記述するが、その内部でBashまたはKornシェル拡張を使用するのは古典的なエラーです。以来/bin/sh非常に多くのシステムで、これらの日に上記のKorn / POSIX家族図の殻の一つであり、そのようなスクリプトは、彼らが上で書かれているシステム上で動作しますが、その後のシステムで失敗する/bin/shシェルの広いボーンファミリーからのものです。ベストプラクティスは、スクリプトがそのような拡張機能を使用している場合は、行を使用する#!/bin/bashか、#!/bin/kshシェバン行にすることです。

特定のBourneファミリシェルスクリプトが移植可能かどうかを確認する方法は多数あります。

  • checkbashismsスクリプトで「bashisms」をチェックするDebianプロジェクトのツールで実行します。

  • SUS3posh指定された機能と、その他のいくつかのマイナーな機能のみを意図的に実装するDebianパッケージリポジトリ内のシェルで実行します

  • 2005年にOpenSolarisの一部としてSunによってオープンソース化されたBourneシェルの改良版であるSchily Toolsプロジェクトoshから実行します。これは、現代のコンピューターで1979スタイルのBourneシェルを取得する最も簡単な方法の1つです。

    Schily Toolsディストリビューションにはbosh多くの非標準機能を備えたPOSIXタイプのシェルも含まれていますが、これはすべてのPOSIXファミリシェルで実行されるシェルスクリプトの互換性をテストするのに役立つ場合があります。それは機能セットでより保守的である傾向がありますbashzshおよびの拡張バージョンksh93

    Schily Toolsには、というシェルも含まれていますbshこれは歴史的な奇妙なものであり、Bourneファミリーのシェルではありません。

  • GNU AutoconfマニュアルPortable Shell Programmingの章をご覧ください。スクリプトで説明している問題のある構成要素の一部を認識できます。

なぜ違うのですか?

同じ理由で、すべて「新規&改良!」状況は異なります:

  • 改善されたバージョンは、後方互換性を壊すことによってのみ改善できました。

  • 誰かが何かが機能するための別の方法を考えました。彼らはそれが好きですが、それは古いものと同じではありませんでした。

  • 誰かが古い標準を完全に理解せずに再実装しようとしたため、混乱して意図しない違いが生じました。


脚注と補足

  1. 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の線のような新しいコンピュータの種類を利用するようになった一方で、VaxenUnixのワークステーション 2.9BSDは、本質的に4.1cBSDのPDPのバージョンだった。彼らがいました同時期、および共有コード VAXが到着したとき。PDPはただ消えていなかったので、2BSDラインがされ、まだ よろめき歩く に沿って。)

    Bourneシェルは、1983年までにUnixの世界のいたるところにあったと言っても差し支えありません。これは、コンピューティング業界の「永久に」近似値です。MS-DOSは、その年の階層のファイルシステムだ(!AWWW、どのようcuuute)をし、最初の24ビットのMacintoshのその9" B&W画面で-ない文字通りグレー、 -来年初めまでは出てこないでしょう。

  2. トンプソンシェルは、今日の標準では非常に原始的でした。これは、今日のスクリプトプログラミング環境ではなく、インタラクティブなコマンドシェルにすぎません。パイプやI / Oリダイレクトのようなものがありましたが、これは典型的には「Unixシェル」の一部と考えられるため、MS-DOSコマンドシェルはUnixから取得するものと考えています。

    BourneシェルはPWBシェルも置き換えまし。これにより、プログラム可能性(ifswitchおよびwhile)や初期の環境変数などの重要な要素がThompsonシェルに追加されました。PWBシェルは、あらゆるバージョンのUnixの一部ではなかったため、Thompsonシェルほど記憶に残りません。

  3. 誰か POSIX対Bourneシェルの互換性について具体的に説明していない場合、彼らが意味することのできるすべての範囲があります。

    極端な場合、彼らは1979年のBourneシェルをベースラインとして使用できます。「shこの意味での互換スクリプトは、」本当のBourneシェルまたはその後継とクローンのいずれかで完全に実行することが予想されることを意味します:ashbashkshzsh、など

    他の極端な人は、代わりにPOSIXによって指定されたシェルをベースラインとして想定します。最近では多くのPOSIXシェル機能を「標準」として採用しているため、組み込みの算術演算、ジョブ制御、コマンド履歴、エイリアス、コマンドライン編集、$()コマンド形式など、Bourneシェルには実際には存在しないことを忘れがちです。置換など

  4. 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その割りに関与年にちなんで名付けられ、。

    ksh88POSIX互換ではありませんが、違いはわずかですが、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今日、純粋な人にめったに出会うことはありません。

  5. AT&Tは、2000年3月まで Kornシェルのソースコードの所有権を保持していました。その時点までに、LinuxとGNU Bashの関係は非常に強かった。Bashとksh93 それぞれには、他比べて利点がありますが、現時点では慣性によりLinuxはBashと密接に関連しています。

    初期のLinuxベンダーは、最も一般的にオーバーGNU Bashの選択理由としてpdkshだった Linuxが始めるされた時点で利用可能に、私は、ユーザーランドの残りのあまりにもから来たので、それはだと思うだろうGNUプロジェクト。Bashのpdksh開発者はKornシェル機能のコピーに制限されていないため、Bashはやや高度です。

    pdkshAT&Tが真のKornシェルにソースコードをリリースした頃、作業は停止しました。ただし、メンテナンスされている2つの主要なフォークがあります。OpenBSDpdkshMirBSD Korn Shellですmksh

    mkshCygwin用に現在パッケージ化されている唯一のKornシェル実装であることが興味深いと思います。

  6. GNU Bashは多くの点でPOSIXを超えていますが、より純粋なPOSIXモードで実行するように要求できます

  7. 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に移行することを望んでいる人もいますが、哲学的な理由ですぐにそうなることはありません。気になる場合は、簡単に切り替えることできます。

  8. /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シェルでは同じように動作します。

  9. 時折、あなたはfishscshまたはrc/esアドヒアランスに遭遇しますが、それらはCシェルファンよりもまれです。

    rcシェルのファミリーはUnix / Linuxシステムでは一般的に使用されませんが、ファミリーは歴史的に重要であり、それが上記の図で位置を獲得した方法です。Bell Labsのオペレーティングシステム設計に関する継続的な研究の一環として作成された、第10版Unixの後継の一種であるBell LabsオペレーティングシステムrcPlan 9の標準シェルです。プログラミングレベルでは、BourneとCシェルの両方と互換性がありません。おそらくそこに教訓があるでしょう。

    の最もアクティブなバリアントは、Byby RakitzisによるUnix クローンに基づいたToby Goodwinによって管理されrcているバリアントのようです。rc


UNOSの「コマンド」、「bsh」、最近のBourne Shellなどとの関係をもっと知りたい場合は、私にメモを送ってください。ヒント:UNOSコマンドには、引数付きの1行のシェルスクリプトとして機能する組み込みコマンド「do」がありました。このアイデアは「dosh」としてBourne Shellに転送され、kshやbashからは取得できないパラメーター化可能なエイリアスを許可します。
気味悪い

pdksh自体がForsythシェルに基づいていることに注意してください。今日はほとんど忘れられていますが、pdkshの遺産には歴史的な意味がありますが、minixの一部のバージョンのシェルであり、msdosに移植されていたためです。
ステファンシャゼラス

25

「sh compatible」とは、すべての互換システムに存在するために必要な基本シェルであるPOSIXをsh指します。sh互換スクリプトは、POSIX互換マシンで動作するはずです。

それはそう言う必要だ理由は、一般的ということです/bin/shへのシンボリックリンクである/bin/bashいくつかのBashismsを使用するように自分自身を宣言したスクリプトに陥るせている、sh#!/bin/sh。これらのスクリプトは、一部の商用Unices、Debianおよびデリバティブを含め、bashとして使用しないシステムでは機能しません。/bin/sh

特にdashsh最近ではデフォルトとしてDebian Almquish Shell を使用する傾向があります。これは、サイズが小さく、高速であることを意図しているためです。この傾向は、想定されるshスクリプトに含まれていた多くのバシズムを浮き彫りにしました。「SH互換性」として何かを説明することは、明示的に内に完全に滞在して、これらのシステムで動作するように意図されていますことを示しているPOSIX-指定した言語 -どこでも動作が保証されますので、すべてのシェルは、その機能のスーパーセットを実装しますが、その拡張子はありません互いに互換性があります。

さまざまなシェルには独自の開発履歴があり、ユーザーの対話的な使用を支援する機能や連想配列などのスクリプト拡張機能を追加したため、時間の経過とともにさまざまな方向に分岐しました。「sh-incompatible」スクリプトは、Bashの[[条件など、これらの非標準の拡張機能の一部を使用します。

他のすべての現在のシェルのbashand tcshおよびzshおよびすべての非POSIX機能は有用であり、それらを必要とする、または必要とする機会がたくさんあります。実行するシステムの/bin/sh基本sh実装にあるこれらの機能に依存することはできないため、動作することを宣言するスクリプトでは使用しないでください。

、使用する必要がないスクリプトは実行しています保証しなければならない、連想配列、と言うbashのではなくsh

#!/bin/bash
declare -A array

それはどこでも動作しbashます。拡張機能を必要とせず、移植性があることを意図したスクリプトはsh、ベースシェルコマンド言語を使用し、それに従うことを宣言する必要があります。

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