
私は通常、シェルを指すために使用される「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間の初期接続のためksh
、csh
そしてtcsh
。 Diehardsは今日でもまだこれらのシェルを使用していますが、少数派に属しています。 ⁶
これらすべての歴史は比較的後発創作者たちがbash
、zsh
とyash
互換性を選択する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シェルは、.dll
ash
としてインストールされていても頻繁に呼び出されます/bin/sh
。ash
BSDの世界外には2つの重要な枝があります。dash
、DebianとUbuntuで広く採用されています2006年に基本的に実装されました/bin/sh
。 (Bashはまだデフォルトです。インタラクティブDebian 派生物の命令シェル。 )これ
ash
注文する存在する忙しい箱、組み込みLinuxでよく使用される実装に使用できます/bin/sh
。古くて古いdash
のでDebian の古いash
パッケージ、コマンド名がBusyBoxにあるにもかかわらず、dash
代わりにBusyBoxの派生として扱うことにしました。ash
(BusyBoxにはシステムで常に似ているわけではありません
ash
。hush
ash
hush
/bin/sh
dash
GNUグータ、どちら呼び出し時にPOSIX以外の拡張の大部分を無効にします。
sh
。このオプションは、Debianとその派生製品を除いて、Linuxのデスクトップとサーバーのバリエーションで一般的です。
AppleがMac OSのデフォルト設定を
tcsh
変更しました。翌年のバージョンである10.15(Catalina)になってBashから抜け出しました。 Bashzsh
はさまざまな点で異なりますが、広くPOSIXと互換性がありません。ksh93
POSIX拡張を含むシェル、ようにオープンBSDで。 OpenBSDシェルは、呼び出し時にBourneシェルとPOSIXシェルとの構文および意味論的非互換性を回避するために動作を変更しますが、純粋なsh
拡張、つまり以前のシェルと競合しない拡張は無効にしません。ksh93
このような状況は一般的ではありません/bin/sh
。
上記の「シェルスクリプト」は、Bourne / POSIXシェルスクリプトを意味する一般的な用語として使用されます。これは、Bourne家族の樹皮がどこにでもあるためです。他のシェルでのスクリプトについて話すには、「Cシェルスクリプト」などの修飾子を指定する必要があります。これは、Cシリーズシェルがデフォルトの対話型シェルであるシステムでも同様です。より良いものBourne シェルを使用してスクリプトを作成します。
ウィキペディアでは、Unixシェルを分類するときにBourneシェル互換、Cシェル互換、その他」。
この画像が役に立ちます。
(SVGバージョン、30kiBを表示するにはクリックするか、表示をクリックしてください。フルサイズPNGバージョン、213KB。 )
「sh互換性がない」とはどういう意味ですか?
互換性のないものについて話す人は、sh
一般的に次の3つのうちの1つを意味します。
彼らは「他の」殻の1つに言及していました。 ⁹
彼らはBourneシェルファミリとCシェルファミリを区別します。
彼らは、他のすべてのBourneシリーズシェルでは利用できない1つのBourneシリーズシェルのいくつかの特定の機能について議論しています。
ksh93
、、bash
特にzsh
以前の「標準」シェルには存在しない多くの機能があります。共有POSIX /ベースを超えると、3つの異なるksh88
方法で互いに互換性がありません。
以下を使用してシェルスクリプトを作成するのは一般的な間違いです。#!/bin/sh
シェルボーンライン上部には Bash または Korn シェル拡張を使用してください。上記のKorn / POSIXファミリのシェルの1つは現在多くのシステムで実行されるため、/bin/sh
これらのスクリプトは作成されたシステムで実行されますが、/bin/sh
より広範なBourneシェルファミリのシステムでは失敗します。スクリプトでこれらの拡張を使用する場合、最良の方法は#!/bin/bash
or shebang行を使用することです。#!/bin/ksh
特定のBourneシリーズシェルスクリプトが移植可能であることを確認する方法はいくつかあります。
通り過ぎるポータブルケースプログラミングの章GNU Autoconf マニュアル。スクリプトで問題のある構成について話していることがわかります。
走る
checkbashisms
スクリプトをチェックするためのDebianプロジェクトのツールがあります。」バシズム」。以下で実行してみてください
posh
、特別に実装されたDebianパッケージリポジトリのシェルです。SUS3、プラスその他の小さな機能。obosh
以下で実行してください。Healyツールプロジェクトこれは、2005年にSunがOpenSolarisの一部としてオープンソースとして提供したBourneシェルの改良版で、最新のコンピュータで1979年スタイルのBourneシェルを入手する最も簡単な方法の1つです。Schily Toolsディストリビューションには
bosh
POSIXスタイルのシェルも含まれています。多くの非標準機能ただし、これはすべてのPOSIXファミリシェルで実行するように設計されたシェルスクリプトの互換性をテストするのに役立ちます。機能セットは、およびbash
のzsh
拡張バージョンよりも保守的な傾向がありますksh93
。Schily Toolsには、次のシェル
bsh
も含まれています。歴史上奇妙なことこれは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のパラレルフォークとなりました。プラズマミニコンピューター3BSDおよび4BSDシリーズは、次のような最新のコンピュータタイプを利用しました。ワックスソンそしてUnixワークステーション。 2.9BSDは本質的に4.1cBSDのPDPバージョンです。彼らは同時代人であり、コードを共有しました。。 VAXが到着してもPDPがすぐに消えないので、2BSDラインはまだ 揺れる ~に沿って.)
1983年には、BourneシェルがUnixの世界のどこにでも存在したとしても過言ではありません。これは、コンピューティング業界で「永遠に」の良い近似です。MS-DOSが階層化されたファイルシステムを持つようになった年でした。(と、とても可愛いですね!)24ビットマッキントッシュ文字通りグレースケールではなく、9インチの白黒画面ブラックそして白色-来年初めまでは出てこないと思います。
トンプソンシェルかなり独創的です今日の基準で見ると。それは今日、私たちが期待するスクリプトプログラミング環境ではなく、インタラクティブなコマンドシェルに過ぎません。これには、「Unixシェル」の円形部分と見なされるパイプやI/Oリダイレクトなどの機能があるためMS-DOS コマンド シェルUnixからインポートするのと同じです。
Bourneシェルも交換しました。回路基板ハウジング
if
、プログラマビリティ(、、switch
およびwhile
)、初期型の環境変数などの重要な事項をThompsonシェルに追加しました。 PWB シェルはすべての Unix バージョンの一部ではないため、Thompson シェルよりもあまり記憶されません。誰かがいついいえ特に、POSIX と Bourne シェルの互換性に関しては、これはさまざまな意味を持つことができます。
極端なケースでは、1979年のBourneシェルを基準として使用することもできます。この意味で、「
sh
互換性のあるスクリプト」とは、実際のBourneシェルまたはそれに続くレプリカ(、、、、ash
など)で完全に実行されることを意味します。bash
ksh
zsh
他の極端には、POSIX指定シェルに基づいて仮定する人がいます。最近では、POSIXシェルの機能が多く「標準」と見なされ、組み込みの算術、ジョブ制御、コマンド履歴、エイリアス、コマンドライン編集、コマンドフォーマットの置換
$()
など、Bourneシェルには実際には存在しないことがよくあります。 、等。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と2
ksh
に分割されました。ksh88
ksh93
ksh88
違いは小さいがPOSIXと完全に互換性がないため、一部のバージョンのksh88
シェルはPOSIXと互換性があるようにパッチが適用されます。 (これはSlashdotのDavid G. Korn博士との興味深いインタビュー。はい、シェルを書く人です。 )ksh93
はい完全に互換性のあるPOSIXシェルの親セット。開発ksh93
銀時々起こるメインソースリポジトリがAT&Tから移行されたためGitHubに行くこの記事を書いている現在最新バージョンのksh93vがリリースされてから約3年になりました。 (プロジェクトのデフォルト名はそのまま残り、ksh93
1993年以降のリリースを示すためにサフィックスが追加されます。)Kornシェルを別々のPOSIXシェルとして含むシステムは、通常Kornシェルを提供しますが、
/bin/ksh
他の場所に隠されている場合もあります。ksh
Kornシェルの名前について話すとき、私たちはksh93
BourneシェルとPOSIXシェルの以前のバージョンと互換性のあるサブセットとの区別された特性について話しています。ksh88
今日、純粋な人にはほとんど会いません。AT&TはKornシェルソースコードを排他的に保有しています。2000年3月まで。当時、LinuxはGNU Bashと非常に密接に関連していました。すごい
ksh93
誰もが他の人よりも利点があります。しかし、この時点で慣性はLinuxをBashと密接に結び付けました。初期のLinuxベンダーがGNU Bashを最も頻繁に選択した理由は次のとおりです。
pdksh
、どちら以前はLinuxが始まったばかりのときに利用可能でした。これは、残りのユーザースペースのほとんどもLinuxで提供されるためです。GNUプロジェクト。pdksh
Bash開発者はKornシェル機能を複製することに限定されないため、Bashはさらに進化しています。pdksh
AT&Tが実際のKornシェルソースコードを公開すると、操作が中断されました。しかし、まだ維持されている2つの主要なフォークがあります。 OpenBSDpdksh
とMirBSDコーエンシェル、mksh
。mksh
これが現在Cygwin用にパッケージ化された唯一のKornシェル実装であることが興味深かったです。csh
1990年代初頭には、/がtcsh
BSD 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
デフォルトシェルとして使用します。4.4BSD-Liteはすべての最新のBSD派生の基礎となっており、その
/bin/sh
ほとんどは以下の1つの主な例外を除いてAlmquist派生としてまだ存在しています。ソースコードストアにこの直系の子孫を表示できます。ネットワークBSDそしてFreeBSD:彼らは最初の日からAlmquistシェルデリバティブを出荷してきました。/bin/sh
最近では、真のバニラBourneシェルを備えたシステムを見つけるのは難しいです。互換性テストに十分近いものを見つけるには、多くの努力が必要です。私は最新のコンピュータで真の1979年ヴィンテージBourneシェルを実行する唯一の方法を知っています。古代UNIX V7ディスクイメージとSIMH PDP-11エミュレータ~からコンピュータ履歴シミュレーションプロジェクト。 SIMHは引き続き実行されます。ほぼすべての現代のコンピュータ、Unixシリーズだけではありません。
そしてオープンソラリス、太陽Bourne ShellのSVR4バージョンは初めてオープンソースです。以前は、Bourne ShellのV7以降のバージョンのソースコードは、Unixソースコードライセンスを持つユーザーのみが利用できました。
これで、このコードは、存在しないOpenSolarisプロジェクトの残りの部分とは別に、さまざまなソースから使用できるようになりました。
最も直接的なソースはガボ Bourne シェルプロジェクト。 2005年、OpenSolarisが最初にリリースされた直後に使用できるようになりました。次の数ヶ月にわたっていくつかの移植性とバグ修正が完了しましたが、プロジェクトの開発は中止されました。
obosh
Jörg Schillingは、次のように、このコードのバージョンを維持するためのより良い作業を行いました。シリーツールパック。これについて詳しくは上記をご覧ください。2005年ソースバージョンのこれらのシェルには、次のものが含まれています。マルチバイト文字セットサポート、職業管理、シェル機能そして、1979年の元のBourneシェルにはなかったその他の機能も含まれています。
元のBourneシェルを使用していることを確認する1つの方法は、Thompsonシェルが簡単に変換するために追加された文書化されていない機能をサポートしていることを確認することです。
^
つまり|
、KornまたはPOSIXタイプのシェルで同様のコマンドを使用すると、次のls ^ more
結果が表示されます。エラーですが、ls | more
実際のBourneシェルと同じように動作します。たまにはお会いします
fish
、scsh
またはrc/es
熱心なファンですが、Cシェルファンよりもまれです。シェルファミリは
rc
Unix / Linuxシステムでは一般的には使用されていませんが、歴史的に重要であるため、上記の図でその場所を占めています。rc
標準シェルですベル研究所プラン9オペレーティングシステム、一種のフォローアップUnixの10番目のバージョンは、オペレーティングシステムの設計に関するBell Labsの継続的な研究の一環として作成されました。 BourneとCシェルの両方とプログラム的に互換性がありません。そこには教訓があります。
答え2
「sh互換」という意味POSIXsh
、すべての互換システムに存在する必要があるデフォルトのシェルです。 sh互換スクリプトは、すべてのPOSIX互換システムで実行する必要があります。
そう言う必要があるのは、通常、/bin/sh
シンボリックリンクを使用すると、一部のBashismが一緒に使用されると宣言するスクリプトに入ることが/bin/bash
できるためです。これらのスクリプトは、一部の商用 Unices を含む as を使用しないシステムでは実行できません。sh
#!/bin/sh
bash
/bin/sh
ダーバンそしてデリバティブ最近の。
特に使用する傾向があります。dash
Debian Almquish Shellsh
は小さく、高速なので、最近のデフォルトになりました。この傾向は、sh
いわゆる台本と呼ばれる多くの屈辱感を強調しています。 「sh 準拠」と記述することは、そのシステム内に完全に残り、そのシステムと動作することを明示的に意図したことを示しています。POSIX固有の言語- すべてのシェルはこの機能の親セットを実装しているため、どこでも動作が保証されますが、拡張機能は互いに互換性がありません。
さまざまなシェルには独自の歴史があり、ユーザーがインタラクティブに使用できるように機能を追加したり、連想配列などのスクリプト拡張を作成するなど、時間の経過とともにさまざまな方向に進化してきました。 「sh非互換」スクリプトは、Bashの条件文などの非標準拡張の一部を使用します[[
。
bash
現在のシェルのPOSIX以外のすべてのtcsh
機能zsh
役に立つ、そして必要な状況がたくさんあります。実行中のシステムの基本実装ではこれらの機能に/bin/sh
依存できないため、使用可能であると宣言するスクリプトでは使用しないでください。sh
連想配列を使用する必要があるスクリプトは、代わりbash
に実行する必要がありますsh
。
#!/bin/bash
declare -A array
これはどこでも適用されますbash
。拡張機能を必要とせず、移植可能なスクリプトはデフォルトのsh
シェルコマンド言語を使用し、それに固執すると宣言する必要があります。