誰も真のBourneシェルを/ bin / shとして使用しないのはなぜですか?


55

基本的に、これまでに使用したシステムには/bin/sh実際の実行可能ファイルがありません。それは常にへのシンボリックリンクですdashbashPOSIXモード、または類似した何かに。

どうして?真のオリジナルを使用することの欠点は何/bin/shですか?(スピード?ライセンス?)


3
Linuxを使用したことがありますか?Linuxで「sh as symlink」を見たことがあります。
グレッグヒューギル

Solarisの最近のバージョンではありません@GregHewgill shにシンボリックリンクksh
ジル「SO-悪であるのをやめる」

1
回答の1つによると、@ Gilles、はい、Solaris 11以降です。これはにリンクされていkshます。
13

1
@GregHewgillまたbash、IIRC にシンボリックリンクされているDarwinも使用しました。
13

6
元の/ bin / shとはどういう意味ですか?Unix V1のThomsonシェル?Unix V7のBourneシェルで、コメントがない関数はありませんでした...?SysIII、SysV、Solaris、HP / UX、BSDでの灰の再実装の1つですか?現在shは標準に基づいています。つまり、スクリプトで標準構文を使用している限り、明確に指定された方法で動作するいくつかの実装が可能です。
ステファンシャゼル

回答:


38

機能の欠如を推測します-コマンド履歴、派手なリダイレクト、コマンドライン編集はありません。BSD cshはこれらの理由でCシェルを導入しました。もう1つの要因は、Genuine Bourne Shellがオープンソース形式でごく最近入手可能になったことです。ライセンスを取得していない限り、配布することはできません。これにより、無料のディストリビューションでは利用できなくなり、他のディストリビューションや* BSDにとってはイデオロギー的に受け入れ難くなりました。

しかし、コードは現在入手可能です。見て、コンパイルして、試してみてください。


50
そして、以前使用していたものにすぐに切り替えます。
イグナシオバスケス-アブラムス

24
@strugee ""機能の欠如 "-なぜこれが問題になるのでしょうか?"はい、良い点...プログラマーがアセンブリ/ C /高級言語のような役に立たないものを使用する理由機械語は直接?事実は次のとおりです機能=開発速度の向上+保守性の向上=コストの削減=優れた使用shは使用方法とまったく同じbashです。
バクリウ

10
実際には機能が不足しているわけではありませんが、POSIXはsh、レガシーBourneシェルではないPOSIX準拠のシェルを実行するコマンドを要求しています。POSIXが必要としませんがshであることを/bin/sh、それはそれはであるためには、最も論理的なディレクトリです。
jlliagre

4
@Bakuriuのコマンド履歴とコマンドラインの編集は、どちらもスクリプトには必要ないものです。
被災者

4
@strugeeこれらが唯一の違いではありません。たとえばshチルダやブレース拡張を持っていない、いくつかの組み込み関数は、(例えば欠けされていないpushdpopdselect)は算術展開を。多くの変数が欠落していPIPESTATUSます。
バクリウ

23

あなたの質問の文は間違っています。Solarisバージョン10まで、レガシーの真のBourneシェルをとして提供しています/bin/sh。これは、異なるシェルで失敗する可能性のある古いスクリプトとの互換性を壊さないために行われました。それ以外の場合、この選択は非常にイライラしました。

Solaris 11を含む残りのUnixおよびUnix系リリースのほとんどではないにしても、POSIXは準拠していないレガシーBourneシェルではなくPOSIXシェルを起動するコマンドを/bin/sh要求するため、POSIX互換シェルを提供しshます。/bin/sh一般的には:

  • ksh88またはksh93商用Unix実装上
  • 変更さbashれたOS/X(以前はzsh
  • ashまたはpdksh他の派生BSDs
  • bashまたはdashGnu / Linuxディストリビューション。

これは必ずしもリンクではありませんが、Gnu / Linux以外の多くのシステムで実際の実行可能ファイルにすることができます。

興味深いことに、あなたの質問に対する最も賛成の答えを述べているにもかかわらず、ディストリビューション開発者がレガシーBourneシェルとは異なるものをインストールする機能の不足ではなく、/bin/sh可能な限りPOSIXに準拠したい、つまりOSのようなUnix。POSIXシェルが従来のBourneシェルよりも多くの機能を備えているという事実は、この標準コンプライアンス目標の副作用にすぎません。

また、一部のシェルは、特にbashが呼び出されたときに異なる動作をすることも事実shです。これにより、シェルから機能が削除されます。


16

私の知る限り、元のBourneシェルは、そのライセンスのために、BSDとGNUプロジェクトで使用できませんでした。

当時、元のUnixにはライセンスがなく、GNUプロジェクトではbashを使用するためにGPLの下にあるシェルが必要でした。

同じことは、すべてのBSDの親であるBSD4にも当てはまります。AT&Tの訴訟のおかげで、彼らはBourneシェルを含む元のUnixからのすべてのソースを書き換える必要がありました。

従来のBSDラインでは、Bourneシェルは4.3BSD-Renoまで出荷されていました(ただし、Net / 2およびそれ以降の4.4BSDでは出荷されていません)。ライセンス上の理由から、Kenneth Almquistによるbourne互換のsvr4のようなsh(しばしばashと呼ばれる)に置き換えられました。

FreeBSDsから man sh

shコマンドであるThompsonシェルは、バージョン1 AT&T UNIXで登場しました。バージョン7 AT&T UNIXでは、shという名前を継承したBourneシェルに置き換えられました。

shのこのバージョンは、AT&T System V Release 4 UNIXのBourneシェルの後、1989年にBSDライセンスの下で書き直されました。

そのため、両方のプロジェクトはBourneシェルを使用せず、真のオープンソースシェルを採用することを余儀なくされました。


7

他の問題がありました。Bourne Shellはmalloc()の代わりにsbrk()を使用していましたが、これにより移植性が低下しました。

Bourne ShellがOpenSolarisを介してOpenSourceになった後、sbrk()をGeoff Collyer(sbrk() Korn Shell)。

Bourne Shellのポータブルバージョンを作成した最初の理由は、1982年から1984年までの「bsh」用に作成したHistory EditorをBourne Shellでも使用できるようにしたことです。一方、「bsh」用に書いた独自の特性のほとんどをBourne Shellに移植しました。

これはとりわけ次のとおりです。

  • Cygwinを含むほぼすべての場所でコンパイルおよび動作します(bashの約2倍高速)
  • LRUリングバッファーを備えた履歴エディター
  • ビルトインTERMCAP
  • 高度なエイリアス(グローバル永続エイリアス、ローカルエイリアス、...)および "dosh"ビルトインと共に、Bourne Shellはパラメーター化可能なエイリアスを許可する唯一のBourne Shellの実装です。
  • 生モードの履歴エディタで複雑なエイリアスを編集するサポート。
  • .sh。*変数を介してexit(2)コードのすべての32ビットにアクセスします。
  • 6桁の分解能を備えた高度な自動タイミング
  • pushd / popd / dirs
  • 組み込みの「検索」
  • stderrからのパイプ
  • パフォーマンスを向上させるためにvfork()を使用します。
  • 最後に、SVr4 Bourne Shellで文書化されたすべてのバグを修正しました。たとえば、サスペンドは常にジョブ制御モードで動作します。...

オンラインのmanページは、 http ://schillix.sourceforge.net/man/man1/bosh.1.htmlにあります。ソースは、次のschilyツールボックスの一部です。

https://sourceforge.net/projects/schilytools/files/

使用することをお勧めします:http : //sourceforge.net/projects/schilytools/files/schily-2015-08-18.tar.bz2 以降のバージョン。

PSフィードバックに興味があります


こんにちはJoerg。BSD shやpdkshのようにPOSIX化されたシェルではなく、Bourneシェルに移植するのはなぜですか?
ステファンシャゼル

Bourne Shellの移植は、stdioを使用しないため、課題でした。これは、元のcshソースを取得し、VAXアセンブラーで記述された非stdio printfを置き換えることでコンパイルするのと同様の課題でした。しかし、私はすでに多くの新しいPOSIX機能をBourne Shellに追加しており、Korn Shellでは不可能な別のファイルシステムで/ anr / usrを使用して起動できるように、SchilliXのBourne Shellを使い続けたいと思っています。
schily

また、kshの速度がvfork()の使用に起因することを確認したかったことに注意してください。Bourne Shellをvfork()を使用するように変換したのは、最近のkshバージョンとまったく同じくらい高速です。これは、元のBourne Shellソースコードから始めたときにのみ得られる経験です。
気味悪い

わかりましたが、sh POSIXに準拠させるまで、多くの関心を引くことはないでしょう。BourneシェルのPOSIXとの非互換性についてオースティングループMLに尋ねたのを覚えていますが、それはあなたが取り組んでいるものですか(Bourneシェルとの後方互換性を壊すことを意味します)?また、人々(少なくとも私)は、POSIX sh構文をBourneシェルの進歩と考えています。Bourne派生シェルを呼び出し続けると、Bourneシェルが間違った印象を与える場合があります。bimsh(Bourneの改善(ala vi / vim))はどうですか?
ステファンシャゼル

私のBourne Shellはいくつかの面ですでにkshよりも優れています。たとえば、より良いエイリアス、pushd / popd / dirs、kshがまだSVr2ベースである場合、代わりに最新のUNIX機能に基づくリソース使用サポートを実装します。あなたがシェルに興味と熟練のように見えるように、私はあなたが読んだ後、次のBourneシェルで見たいのですがどのようにアイデアを取得したいと思い:schillix.sourceforge.net/man/man1/bosh.1.htmlのなお、これまでのところ、すべての新しいコードが#ifdefされており、いくつかの機能(stderrパイプなど)をset(1)でオンにする必要があります。
気違い

4

これは、100%下位互換性を提供するシェルにリンクされています。元のシェルが持っているものを失うことはありませんが、その上でより多くの機能を獲得します。欠点はないので、なぜ新機能をお見逃しなく?これは、/bin/vi通常vimにリンクされるのと同じ理由です。


5
欠点は、人々が自分の1つのシステムで動作するスクリプトを作成し、スクリプトが互換性がないと互換性があると考えることです。私はかつてbashを必要とするが/ bin / shと呼ばれるほぼ100個のGentooシェルスクリプトを修正しました。/ bin / shをbashではなくdashに変更すると、それらはすべて壊れました。
ザンリンクス

3
「マイナス面なし」-速度。たとえばbash、はるかに、はるかに遅いdash
-strugee

@strugeeシェルでms範囲の改善速度を探しているなら、おそらくその仕事に適切なツールを使用していないでしょう。
クリスダウン

1
@ChrisDownは「ms範囲の改善」を定義していますか?
被災者

2
POSIX sh構文は、Bourne sh構文との完全な下位互換性はありません。たとえばIFS=,; rm file1,file2,file3、Bourneシェルでこれらの3つのファイルを削除します。その(愚かな)機能はPOSIX shで削除されました。Bourneシェル用に記述されたスクリプトがPOSIX shで異なる動作を引き起こす可能性のある微妙な違いが多数あります。
ステファンシャゼル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.