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

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

私は通常、シェルを指すために使用される「sh-互換」というフレーズを見たことがあります。シェル内で実行できるプログラムにも適用されるかどうかはわかりません。

シェルや他のプログラムが「sh互換」とはどういう意味ですか? 「sh互換性がない」とはどういう意味ですか?

編集:bashとshの違いを尋ねるこの質問は非常に関連しています。 shとbashの違い

私はまだ「sh互換」が何を意味するのかを直接答えたいと思います。 「sh互換」は「シェルコマンド言語の実装」を意味すると合理的に予想できますが、「sh互換」シェルがなぜそんなに多く、異なるのですか?

ベストアンサー1

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

これボンシェル1979年に初めて公開された。Unix V7。ほぼすべてのUnixおよびUnixシリーズシステムV7 Unixで- 精神的に - Bourneのシェルは私達と「永久に」一緒にいました。

Bourneシェルは実際に古いシェルを置き換え、名前が変更されました。トンプソンシェルしかし、それはUnixの歴史の初期に起こったので、今日ほとんど忘れられています。BourneシェルはThompsonシェルの親セットです。

BourneシェルとThompsonシェルはどちらもsh。これPOSIX 指定シェルまた〜として知られているsh。したがって、誰かが「互換性がある」と言うと、shこのシェルスイートを意味します。具体的に説明したい場合は、「POSIXシェル」または「Bourneシェル」と言います。

バージョン1988ベースのPOSIXシェルカンシェルカンパニー、これはAT&T UnixのBourneシェルに代わるものでした。BSD Cシェル⁴POSIXシェルの祖先に関する限り、kshほとんどのUnixおよびUnixシリーズシステムには、Kornシェルのいくつかのバリエーションが含まれています。例外は通常、POSIXシェル全体が占めるスペースを余裕がない小型組み込みシステムです。

つまり、POSIX シェルと区別される Korn シェルは、商用 Unix 世界外で実際に使用されたことはありません。なぜなら、その上昇はUNIXの初期商用化と同時に行われたからだ。Unix戦争。 BSD UnixはCシェルを好むことを放棄し、Linuxが初めて起動されたときにそのソースコードを無料で使用することはできませんでした。 ⁵ したがって、初期のLinuxディストリビュータは、Linuxカーネルで使用するコマンドシェルを見つけるときによくGNUグータsh、あなたが言う互換性のあるものの一つです。 GNU Bashは多くの点でPOSIXを上回っていますが、より純粋なPOSIXモードで実行する必要がある

LinuxとBash間の初期接続のためkshcshそしてtcsh。 Diehardsは今日でもまだこれらのシェルを使用していますが、少数派に属しています。 ⁶

これらすべての歴史は比較的後発創作者たちがbashzshyash互換性を選択するsh:Bourne / POSIX互換性は、Unixシリーズシステムのシェルが広く採用されるために提供する必要がある最小レベルです。

多くのシステムでは、デフォルトの対話型コマンドシェル/bin/shは何か異なります。/bin/shおそらく:

  • オリジナルBourneシェル。これは、Solaris 10(2005年リリース)や以前のバージョンなど、以前のUNIX®システムでは一般的です。 ⁸

  • POSIX 認証シェル。これは、Solaris 11(2010)などの最新のUNIX®システムで一般的です。

  • これ錬金術の皮。これはオープンソースのBourne / POSIXシェルクローンです。1989年にUsenetに初公開、バークレーに貢献中国南方研究グループAT&Tソースコードを含まない最初のBSDリリースに含まれていました。4.4BSDライトバージョン.7 Almquistシェルは、.dllashとしてインストールされていても頻繁に呼び出されます/bin/sh

    ashBSDの世界外には2つの重要な枝があります。

    1. dashDebianとUbuntuで広く採用されています2006年に基本的に実装されました/bin/sh。 (Bashはまだデフォルトです。インタラクティブDebian 派生物の命令シェル。 )

    2. これash注文する存在する忙しい箱、組み込みLinuxでよく使用される実装に使用できます/bin/sh。古くて古いdashのでDebian の古いashパッケージ、コマンド名がBusyBoxにあるにもかかわらず、dash代わりにBusyBoxの派生として扱うことにしました。ash

      (BusyBoxにはシステムで常に似ているわけではありませんashhushashhush/bin/shdash

  • GNUグータ、どちら呼び出し時にPOSIX以外の拡張の大部分を無効にします。sh

    このオプションは、Debianとその派生製品を除いて、Linuxのデスクトップとサーバーのバリエーションで一般的です。

    AppleがMac OSのデフォルト設定をtcsh変更しました。翌年のバージョンである10.15(Catalina)になってBashから抜け出しました。 Bashzshはさまざまな点で異なりますが、広くPOSIXと互換性がありません。

  • ksh93POSIX拡張を含むシェル、ようにオープンBSDで。 OpenBSDシェルは、呼び出し時にBourneシェルとPOSIXシェルとの構文および意味論的非互換性を回避するために動作を変更しますが、純粋なsh拡張、つまり以前のシェルと競合しない拡張は無効にしません。

    ksh93このような状況は一般的ではありません/bin/sh

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

ウィキペディアでは、Unixシェルを分類するときにBourneシェル互換、Cシェル互換、その他」。

この画像が役に立ちます。

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

(SVGバージョン、30kiBを表示するにはクリックするか、表示をクリックしてください。フルサイズPNGバージョン、213KB。 )

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

互換性のないものについて話す人は、sh一般的に次の3つのうちの1つを意味します。

  1. 彼らは「他の」殻の1つに言及していました。 ⁹

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

  3. 彼らは、他のすべてのBourneシリーズシェルでは利用できない1つのBourneシリーズシェルのいくつかの特定の機能について議論しています。ksh93、、bash特にzsh以前の「標準」シェルには存在しない多くの機能があります。共有POSIX /ベースを超えると、3つの異なるksh88方法で互いに互換性がありません。

以下を使用してシェルスクリプトを作成するのは一般的な間違いです。#!/bin/sh シェルボーンライン上部には Bash または Korn シェル拡張を使用してください。上記のKorn / POSIXファミリのシェルの1つは現在多くのシステムで実行されるため、/bin/shこれらのスクリプトは作成されたシステムで実行されますが、/bin/shより広範なBourneシェルファミリのシステムでは失敗します。スクリプトでこれらの拡張を使用する場合、最良の方法は#!/bin/bashor shebang行を使用することです。#!/bin/ksh

特定のBourneシリーズシェルスクリプトが移植可能であることを確認する方法はいくつかあります。

  • 通り過ぎるポータブルケースプログラミングの章GNU Autoconf マニュアル。スクリプトで問題のある構成について話していることがわかります。

  • 走るcheckbashismsスクリプトをチェックするためのDebianプロジェクトのツールがあります。」バシズム」。

  • 以下で実行してみてくださいposh、特別に実装されたDebianパッケージリポジトリのシェルです。SUS3、プラスその他の小さな機能

  • obosh以下で実行してください。Healyツールプロジェクトこれは、2005年にSunがOpenSolarisの一部としてオープンソースとして提供したBourneシェルの改良版で、最新のコンピュータで1979年スタイルのBourneシェルを入手する最も簡単な方法の1つです。

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

    Schily Toolsには、次のシェルbshも含まれています。歴史上奇妙なことこれはBourne家族の殻ではありません。

なぜ違うの?

同様に、「新しく改良されたもの」はすべて異なります。

  • 改善されたバージョンは、以前のバージョンとの互換性を破らなければ改善できません。

  • 誰かが自分が好む他の作業方法を考えましたが、既存の作業方法と同じではありませんでした。

  • 誰かが以前の標準を完全に理解していないまま再実装しようとすると、意図しない違いが発生して混乱しました。


脚注と解説:

  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のパラレルフォークとなりました。プラズマミニコンピューター3BSDおよび4BSDシリーズは、次のような最新のコンピュータタイプを利用しました。ワックスソンそしてUnixワークステーション。 2.9BSDは本質的に4.1cBSDのPDPバージョンです。彼らは同時代人であり、コードを共有しました。。 VAXが到着してもPDPがすぐに消えないので、2BSDラインはまだ 揺れる ~に沿って.)

    1983年には、BourneシェルがUnixの世界のどこにでも存在したとしても過言ではありません。これは、コンピューティング業界で「永遠に」の良い近似です。MS-DOSが階層化されたファイルシステムを持つようになった年でした。(と、とても可愛いですね!)24ビットマッキントッシュ文字通りグレースケールではなく、9インチの白黒画面ブラックそして白色-来年初めまでは出てこないと思います。

  2. トンプソンシェルかなり独創的です今日の基準で見ると。それは今日、私たちが期待するスクリプトプログラミング環境ではなく、インタラクティブなコマンドシェルに過ぎません。これには、「Unixシェル」の円形部分と見なされるパイプやI/Oリダイレクトなどの機能があるためMS-DOS コマンド シェルUnixからインポートするのと同じです。

    Bourneシェルも交換しました。回路基板ハウジングif、プログラマビリティ(、、switchおよびwhile)、初期型の環境変数などの重要な事項をThompsonシェルに追加しました。 PWB シェルはすべての Unix バージョンの一部ではないため、Thompson シェルよりもあまり記憶されません。

  3. 誰かがいついいえ特に、POSIX と Bourne シェルの互換性に関しては、これはさまざまな意味を持つことができます。

    極端なケースでは、1979年のBourneシェルを基準として使用することもできます。この意味で、「sh互換性のあるスクリプト」とは、実際のBourneシェルまたはそれに続くレプリカ(、、、、ashなど)で完全に実行されることを意味します。bashkshzsh

    他の極端には、POSIX指定シェルに基づいて仮定する人がいます。最近では、POSIXシェルの機能が多く「標準」と見なされ、組み込みの算術、ジョブ制御、コマンド履歴、エイリアス、コマンドライン編集、コマンドフォーマットの置換$()など、Bourneシェルには実際には存在しないことがよくあります。 、等。

  4. Kornシェルの歴史は1980年代初頭にさかのぼりますが、AT&Tは2017年までこれをUnixに移植しませんでした。システムVバージョン41988. 多数の商用UnixがSVR4をベースにしているため、kshほぼすべての関連商用Unixは1980年代後半からSVR4を採用しました。

    (いくつかの奇妙なUnix風味に基づいています)SVR3SVR4の発売後、早くから一部市場を占有したが、まず壁にもたれていつ革命来る。 )

    1988年は初年でもある。POSIX規格Kornシェルに基づく「POSIXシェル」を導入しました。その後、1993年にKornシェルの改良版がリリースされました。 POSIXはもともとバージョンを効果的に固めたので、2つのメジャーバージョン、つまり分割年の名前を付けた1と2kshに分割されました。ksh88ksh93

    ksh88違いは小さいがPOSIXと完全に互換性がないため、一部のバージョンのksh88シェルはPOSIXと互換性があるようにパッチが適用されます。 (これはSlashdotのDavid G. Korn博士との興味深いインタビュー。はい、シェルを書く人です。 )

    ksh93はい完全に互換性のあるPOSIXシェルの親セット。開発ksh93時々起こるメインソースリポジトリがAT&Tから移行されたためGitHubに行くこの記事を書いている現在最新バージョンのksh93vがリリースされてから約3年になりました。 (プロジェクトのデフォルト名はそのまま残り、ksh931993年以降のリリースを示すためにサフィックスが追加されます。)

    Kornシェルを別々のPOSIXシェルとして含むシステムは、通常Kornシェルを提供しますが、/bin/ksh他の場所に隠されている場合もあります。

    kshKornシェルの名前について話すとき、私たちはksh93BourneシェルとPOSIXシェルの以前のバージョンと互換性のあるサブセットとの区別された特性について話しています。ksh88今日、純粋な人にはほとんど会いません。

  5. AT&TはKornシェルソースコードを排他的に保有しています。2000年3月まで。当時、LinuxはGNU Bashと非常に密接に関連していました。すごいksh93 誰もが他の人よりも利点があります。しかし、この時点で慣性はLinuxをBashと密接に結び付けました。

    初期のLinuxベンダーがGNU Bashを最も頻繁に選択した理由は次のとおりです。pdksh、どちら以前はLinuxが始まったばかりのときに利用可能でした。これは、残りのユーザースペースのほとんどもLinuxで提供されるためです。GNUプロジェクトpdkshBash開発者はKornシェル機能を複製することに限定されないため、Bashはさらに進化しています。

    pdkshAT&Tが実際のKornシェルソースコードを公開すると、操作が中断されました。しかし、まだ維持されている2つの主要なフォークがあります。 OpenBSDpdkshMirBSDコーエンシェル、mksh

    mkshこれが現在Cygwin用にパッケージ化された唯一のKornシェル実装であることが興味深かったです。

  6. csh1990年代初頭には、/がtcshBSD Unixの基本的な対話型シェルでした。

    BSDバリアントとして、Mac OS Xの初期バージョンは、Mac OSを介してこのように見えました。10.2 「ジャガー」。 OS X は、tcshデフォルトのシェルを Bash から次に切り替えます。OS X 10.3「ブラックパンサー」。この変更は、10.2以前からアップグレードされたシステムには影響しません。これらの変換されたシステムの既存のユーザーはtcshシェルを維持します。

    FreeBSDがtcshデフォルトのルートシェルとして使用されるバージョン14までしかし、今はPOSIX互換のエントリです。Almquistケースバリアント。 NetBSDでも同様です。

    OpenBSDはフォークをpdkshデフォルトシェルとして使用します。

    LinuxとOSの人気上昇哲学的な理由。これは簡単に切り替える、これがあなたをいじめる場合。

  7. 4.4BSD-Liteはすべての最新のBSD派生の基礎となっており、その/bin/shほとんどは以下の1つの主な例外を除いてAlmquist派生としてまだ存在しています。ソースコードストアにこの直系の子孫を表示できます。ネットワークBSDそしてFreeBSD:彼らは最初の日からAlmquistシェルデリバティブを出荷してきました。

  8. /bin/sh最近では、真のバニラBourneシェルを備えたシステムを見つけるのは難しいです。互換性テストに十分近いものを見つけるには、多くの努力が必要です。

    私は最新のコンピュータで真の1979年ヴィンテージBourneシェルを実行する唯一の方法を知っています。古代UNIX V7ディスクイメージとSIMH PDP-11エミュレータ~からコンピュータ履歴シミュレーションプロジェクト。 SIMHは引き続き実行されます。ほぼすべての現代のコンピュータ、Unixシリーズだけではありません。

    そしてオープンソラリス太陽Bourne ShellのSVR4バージョンは初めてオープンソースです。以前は、Bourne ShellのV7以降のバージョンのソースコードは、Unixソースコードライセンスを持つユーザーのみが利用できました。

    これで、このコードは、存在しないOpenSolarisプロジェクトの残りの部分とは別に、さまざまなソースから使用できるようになりました。

    最も直接的なソースはガボ Bourne シェルプロジェクト。 2005年、OpenSolarisが最初にリリースされた直後に使用できるようになりました。次の数ヶ月にわたっていくつかの移植性とバグ修正が完了しましたが、プロジェクトの開発は中止されました。

    oboshJörg Schillingは、次のように、このコードのバージョンを維持するためのより良い作業を行いました。シリーツールパック。これについて詳しくは上記をご覧ください。

    2005年ソースバージョンのこれらのシェルには、次のものが含まれています。マルチバイト文字セットサポート、職業管理、シェル機能そして、1979年の元のBourneシェルにはなかったその他の機能も含まれています。

    元のBourneシェルを使用していることを確認する1つの方法は、Thompsonシェルが簡単に変換するために追加された文書化されていない機能をサポートしていることを確認することです。^つまり|、KornまたはPOSIXタイプのシェルで同様のコマンドを使用すると、次のls ^ more結果が表示されます。エラーですが、ls | more実際のBourneシェルと同じように動作します。

  9. たまにはお会いしますfishscshまたはrc/es熱心なファンですが、Cシェルファンよりもまれです。

    シェルファミリはrcUnix / Linuxシステムでは一般的には使用されていませんが、歴史的に重要であるため、上記の図でその場所を占めています。rc標準シェルですベル研究所プラン9オペレーティングシステム、一種のフォローアップUnixの10番目のバージョンは、オペレーティングシステムの設計に関するBell Labsの継続的な研究の一環として作成されました。 BourneとCシェルの両方とプログラム的に互換性がありません。そこには教訓があります。

おすすめ記事