なぜBashはどこにでもある(すべてではないにしても、ほとんどのLinuxディストリビューションで)?


50

Bashは、私が試したすべてのLinuxディストリビューションで、デフォルトでZシェル(zsh)などの代替物よりも使用されています。これには技術的または歴史的な理由がありますか?


1
そうではありません。私のFreeBSDシステムでは、tcshがデフォルトのシェルです!

54
FreeBSDシステムはLinuxディストリビューションではありません。

8
神は...ディストリビューションの間にいくつかの一貫性があります禁じる
OMGポニー

4
いいえ、ただし「どこでも」に属します:)

回答:


106

歴史(研究ではなく、ベル研究所の人々との付き合いにあまりにも多くの時間を費やすことで得た)

  1. 最初は(最初がUnixバージョン7であると考えている場合)Bourneシェルでした。Steve Bourneは、ユーザーの対話を制御するシェルが、オペレーティングシステムの特別な部分ではなく、ユーザープログラムである可能性があることを初めて示しました。歴史的なブレークスルー。シェル自体はスクリプト作成には比較的きれいでしたが、コマンドライン編集やジョブ制御はありませんでした。BourneのUnixシェル紹介は、今日の初心者ユーザーにとってはまだ有用です。

    編集:私はケン・トンプソンとジョン・マシー、またMulticsの「先史時代」を無視しました。Bourneはこのすべての作業を知っていたはずです(彼は同じ研究所の1127、Bell Labsにありました)が、Bourneのシェルは決定的なものであり、Steve Bourneによって解釈される場合を除き、以前の作業にはほとんど影響がありませんでした。たとえば、Kenは後でPlan 9 Cコンパイラを作成し、Plan 9に非常に影響を与えましたが、Tom DuffのPlan 9シェル(rc)に関する論文には、ThompsonではなくBourneのシェルのみが記載されています。

  2. シェルは単なるユーザープログラムなので、誰でも作成できます。バージョン7 Unixがニュージャージーで作成されたとき、バークレーUnixはカリフォルニアで作成されていました。BerkeleyのBill Joy cshはCシェルを書きました。ジョイはジョブ制御と履歴を追加し、その後コマンドライン編集を行いましたが、ボーンの仕事を知らなかったため、彼の言語はトンプソンシェル(前の弾丸で「先史時代」と考えていました)に基づいていました。Unixコミュニティはジョブコントロールを愛していましたが、ボーンの言語も愛していました。csh言語に対する特に良いとは言えない論争については、「Cshプログラミングが有害と見なされる」を参照してください。しばらくの間、多くの人cshがジョブ制御機能と履歴機能のためにインタラクティブに使用していましたが、Bourneを使用shしてスクリプトを記述していました。この状況は理想的とは言えませんでした。

    編集:私の年表をまっすぐにしてくれたDigitalRossに感謝しcshます。私はBSDを「バークレーの異端」と呼んでいる人々から教育を受けたので、そこには事実がほとんどありませんでした。

  3. Bell LabsのDave Kornは、Bourneシェルの見事なリエンジニアリングを行い、Kornシェル(ksh)を作成しました。Bourneシェルとの完全な下位互換性shがありましたが、非常に多くの改善が行われました。 kshPOSIX標準の基礎となり、Sunソフトウェアとともに標準として出荷されました。(これはビルジョイがバークレーを離れてサンを見つけるのを助けたという事実にもかかわらず、彼らはソフトウェアの第一人者でした。)

  4. Bell LabsとAT&Tは、kshオープンソースの作成に愚かに失敗します。ksh88は広く使用されていますが、ソースを持つことは違法です。特定の人々は非常に中毒になり、デジタル犯罪者になります。

    編集:これは本当に愚かでしたか?わかりにくい。バークレーはすでにUnixを配布しており、他の企業もすぐにそれに追随する予定でしたが、コーポレートマスターがUnixへの課金を信じていた時代でした。しかし、結果は次のとおりです。AT&T Unixは何度もさまざまな関係者に売却された後、死んでいます。BSDおよびその派生物は健在ですが、「Linux」および「GNU」と呼ばれるこれらの新興企業は、かつてBell Labsに属していた大きなシェアを持っています。

  5. Free Software Foundationは、POSIXシェルのゼロからの実装を「クリーンルーム」で行い、Dave Kornのすべてのアイデアを現在のものとし、さらに通常のFSFスタイルで、プログラム可能な補完などの独自の新機能を追加します。彼らはそれを「Bourne again」シェル、またはと呼びますbash

  6. 1990年代半ばにAT&Tのオープンソースksh93がリリースされましたが、それまでには広範に採用するには遅すぎました。ライセンス契約は奇妙なことに非標準です。 bashそして、ksh発散し、ksh決しては、歴史の中でその場所での市場シェア見合うを実現しています。

教訓:

  • 市場への最初の適切な製品が勝ちます(sh)。

  • 人々は新機能(ジョブ制御、コマンド補完)を愛していますが、古いスクリプトが機能し続けると、さらにそれらを愛します。

  • 編集:工学の教授は歴史を科学の歴史家に任せるべきだ:-)


あなたは本当に、bashが他のすべてよりも人気があることを最も完全かつ正確に説明していると思います。zshをデフォルトとする環境を見てきましたが、すべての構文が少しずれていて、それを理解できないか、間違いを犯しているので、私はそれらを嫌います。

Bullet(1)には修正が必要です。BourneシェルがMasheyシェルになる前、Masheyシェルがurシェルになる前に、Ken Thompsonシェルが必要です。en.wikipedia.org/wiki/Unix_shell
Jim Ferransを

2
特にノーマンを責めることなく、ここには多くの不正確さがあります。Ken Thompsonは最初のシェルを作成しました。これはV6で唯一のシェルであり、V7と32Vで並行して使用されていました。スティーブンボーンは「最初の」シェルライターではなく、KTシェルを書き直しました。Cshは4.1BSDまでジョブを制御していませんでしたが、それを取得した最初のシェルでした。Cshはシェル構文を変更せず、Bourneシェルと同様にV6シェルと下位互換性がありました。当時、ほとんどすべてのコードがライセンスされていました。Unixのライセンス料を請求することについて、何が愚かでしたか?
DigitalRoss

2
私はおそらくこれをあまりうまく説明していないので、もう一度試してみましょう。Csh はBourneよりも前、または遅くとも1大陸離れた並列実装でした。(インターネットの前、それは重要でした。)彼が書いたとき、私は時々Cory HallのBill Joyの隣に座っていました。彼がV6で書いたことは絶対に保証できます。先ほど述べたように、csh(およびBourne)はV6-Thompsonと下位互換性があります。もちろん、Bourne互換ではないため、AFAIK Bill Joyの才能には未来を見ることは含まれていませんでした
DigitalRoss

1
bashプログラム可能な補完のアイデアをとらなかったのtcshですか?

46

Bashには、まったく異なる2つのことがあります。

  1. それは素晴らしいシェルです。履歴置換cshなどのクールな機能の一部を!posix構文に統合するのは、おそらく2つのシェルの1つ(もう1つはzsh)です。配列を含む多くの拡張機能があります。

  2. これはFSF / GNUシェルです。オープンソースの世界では、これは一種のキャッシュを提供します。

また、常にデフォルトとは限らないことも付け加えてください。ash多くの場合、/ bin / shとして使用されるためbash、対話型のシェルである一方ashで、「コマンドファイルを実行するだけ」のシェルになります。これは、ash小さくて高速で、posix機能が含まれているため、適切なサブセットだからです。ash対話型シェルとしての使用には問題がある場合があります。たとえば、NetBSDでは、すべての機能が組み込まれているため、うまく機能します。それは一種のシェルのようなものですbashが、外部パッケージです。しかし、Linuxではash通常、非対話型と見なされます。したがって、それらは履歴なしでコンパイルされ、それらの巨大なgnu configureスクリプトを実行するためだけに使用されるという理論の(重要な)行編集なしでコンパイルされます。

二つの貝の物語

シェルの本当の歴史

更新:シェルがWeb上の場所から場所へコピーされるという不正確な履歴があり、人々は当然のことながらそれを信じています。ここでは、正確なバージョンを提供し、それを実証するためのリンクをいくつか提供します。

  1. 最初のシェルは確かにボーンシェルではなく、ケントンプソン自身が作成し、V6で配布しました。これはAT&Tがさまざまな大学や政府研究所に送信したバージョンです。これがUnixをマップに載せた理由です。すべての基本<, >, >>, |, &がありましgotoたが、標準入力を求める外部プログラムを介した単純な制御構文がありました。複雑なシェルスクリプトはありませんでした。後のシェルは、別のfdでコマンド入力を開きます。今日は一見シンプルに見えるかもしれませんが、1970年代のコンピューティングであるホラー映画では、それは地球上で最高のものでした。信じられないかもしれませんが、この古代のシェルには今日独自のtwitterストリームがあり、もちろんホームページもあります
  2. 2番目のシェルcsh UCBのビル・ジョイviによって (そうであったように)書かれました。これはGNU readlineおよびNetBSD editlineの前であったため、構文を使用して履歴を作成することは完全に合理的であるように思われました。Cshは、今日のシェル機能のほとんどを追加しましたが、csh構文を使用しました。cshは、構文を変更しませんでした(無償またはその他)。実際には、Thompsonシェルとの後方互換性があり、元々TSソースコードが含まれていました。!
  3. 3番目のシェルは、構文が異なるBourneシェルでした。UnixはUCBとAT&Tで並行して開発されていました。このシェルは、そう、それはハード新しいUnixのポート上で実行するように作られた奇妙なメモリアロケータ(私はそれだけでより多くのメモリを使用したと思われる、SIGSEGVをトラップされ、新しいBRK(2)を行った後、再度試してみました)持っていたoshし、cshいくつかの時間のために人気のある滞在を。インターネットがなく、SWがライセンスされていたため、その環境では、スティーブンボーンがジョイのシェルを知らず、ジョイがボーンを知らなかった可能性があります。UCBがVAXと、今では忘れられていたUnix / 32Vのプレリリースを入手したときに、2つのシェルが最初に出会った可能性があります。ビルがメモリ割り当てについて不満を言ったことを覚えています。両方のシェルはV6シェルと下位互換性があることに注意してください、彼らは単に異なる方向に構文を拡張しました。
  4. AT&TがBourne互換を追加した複数の互換性のないシェルが本当にありましたksh。最終的には、cshソースコードが半入手可能になりましたが、AT&Tとカリフォルニア大学の訴訟で拘束されました。それでも、これらはBSD Unixの栄光の日々でした。50,000ドルの費用を払うことができる洗練された企業がAT&Tライセンスを購入し、4.x BSDディストリビューションをインストールすると、大学は無料で入手できました。
  5. 多くの法的および技術的な問題があるこの状況では、さまざまな独立した実装が行われました。少なくともcshBourneシェル構文と同じくらい多くの構文が使用され、一部は2つを統合しました。あなたは持っていた、少なくともtcshzshbash、とash。Bourne構文はAT&Tリリースの一部である「公式」でしたが、当時はBSDが非常に重要であり、当初はBSDだったSunが世界で遭遇したかなりの量のUnix SWを配布しました。
  6. USLの訴訟もあり、FSFとLinuxにはオープンフィールドがありました。一方、AT&Tは地球上の数少ないエンティティ(カリフォルニア州)との戦いを選択することができたため、最終的に彼らは訴訟に勝ちませんでした。足場。しかし、その頃にはLinuxとbashがいたるところに存在していたため、今日のBSDはニッチです。
  7. 最後に、bashは優れたシェルであり(元の作者によって個人的には見過ごされているように見えますが)、それ自体が成功していることの称賛に値します。ash、bash、およびkshが構文戦争に勝っていなかったとしても、cshはtcshとzshによって食われていたでしょう。

また、/ bin / shを静的にリンクする必要があります。

何かあれば/bin/sbin依存/usr、壊れてやニーズが固定されるという。それらは、のライブラリにのみ依存する必要があり/libます。loginPAM のみが必要です。動的ライブラリを必要とする「新しいAPI」はNSSです。「トレンド」?NetBSD 2.0は5年前に完全に動的に/bin/sbin5年前にFreeBSD 5.2に、そしてLinux ...に切り替えました。これはディストリビューションによって異なりますが、それも長い間です。
一時的な2009年

2
私の答えが私のオリジナルの作品であることを非常に明確にしたいと思います。どこからも単語がコピーされていません。
ノーマンラムジー

1
確かに、あなたがそれを貼り付けたという意味ではありませんでした。ただ、周りに多くの誤報があり、すでに誤解された物語を報告したことであなたをbりたくありませんでした。
DigitalRoss

6

@DigitalRossの発言に追加するには

  • Bashはposix-shの完全なスーパーセット代替品であり、/ bin / shとして呼び出された場合でもposix-shを完全にエミュレートします。Posix-shは、共通分母シェルとしての商用UNIXシステムの「標準」でした。ですから、そこから始まり、それに基づいて何かが始まるのはたくさんのことです。

4

Linuxは単なるカーネル(および必要なサポート)であり、GNUは「Linux」と呼ばれるものを使用可能にする基本的なUnixソフトウェアクローンをすべて提供する(または提供した)ためです。Bashは、Unixバージョン7 の古いBourneシェル(sh)のクローンとして記述されたGNUプロジェクトのシェルです。


彼は「なぜシェルプログラムがあるのか​​」と尋ねていません。
hasen

@hasen j:彼が使用したすべてのLinuxシステムがデフォルトでシェルとしてBashを使用する歴史的な理由があるかどうか質問されます。
2009年

2
@hasen j:beggsは「なぜシェルプログラムがあるのか​​」と答えていません。あなたは答えのポイントを逃しました、他のすべてのSOニージャークダウンボターは明らかにそうです。

1

unix.comの調査によると、kshよりもはるかに先ではありません。
/ bin / sh 83 8.96%
/ bin / csh 36 3.89%
/ bin / ksh 370 39.96%
/ bin / tcsh 36 3.89%
/ bin / bash 401 43.30%


0

Bashはその豊富な機能セットにより広く受け入れられています。また、CシェルやKornシェルなどの他のシェルの機能も採用しています。これらの機能セットをご覧ください


0

'bash'は100% 'sh / ksh'と互換性があり、 'ksh'はPOSIXシェルであるためです。

したがって、POSIX準拠のシステムが必要で、Linuxを使用している場合は、bashを使用します。

商用UNIXを使用している場合、通常はデフォルトのシェルとしてkshを取得します(昔のshをそのまま使用することもあります)。何らかの理由で、Sunは依然としてデフォルトのflakey csh c-shellを使用しています。

利点は、移植性です。hp-uxまたはAIX用に記述された.shは、変更なしでlinux 'bash'として実行される可能性が高くなります。


kshPOSIXシェルではありません。POSIXシェルのようなものはありません。POSIX仕様に準拠するシェルがありますが、これkshは1つですが、決して唯一のものではありません。

0

そして、他のすべての答えに追加するzshことは、後方互換性を持つことを意味しません。おそらく互換性があるように設定できますが、その機能は失われます。

私はzsh通常のインタラクティブシェルとして使用しますが、bash/ dashシェルスクリプト言語としてはより正気に見えます。それらは魔法の量が少なく、より予測可能です...これは、数年間機能するスクリプトを書くとき、私にとってより重要です。


0

ただ、混乱事項に、shコマンドは時々ちょうどシンボリック別のシェルプログラムへのリンク、などであるashbashまたはdash

Ubuntuはこれをにリンクしていましたbash。これbashは、準拠するBourneシェルスクリプトを実行するように設計されているためです。

しかし最近、Ubuntuはへのshリンクを持つようになりましたdash。スクリプト(およびスクリプト)dashを実行するように設計されていますが、bashスクリプトshのみに使用されるように設計されているため、のインタラクティブな機能が欠けていますbash。これにより、サイズが小さくなり、(おそらく)高速になります。

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