web-dev-qa-db-ja.com

BashまたはKornShell(ksh)?

* nixは初めてではありませんが、最近はプロンプトで多くの時間を費やしています。私の質問は、KornShell(ksh)またはBash Shellを使用する利点は何ですか?一方を他方よりも使用する場合の落とし穴はどこにありますか?

純粋にスクリプトを作成するのではなく、ユーザーの観点から理解することを目指しています。

59
user13158

バッシュ。

さまざまなUNIXおよびLinux実装には、さまざまなソースレベルのkshの実装があります。一部は実際のksh、一部はpdksh実装、一部は「ksh」性格を持つ他のシェルへのシンボリックリンクです。これにより、実行動作に奇妙な違いが生じる可能性があります。

少なくともbashでは、それが単一のコードベースであることを確認できます。心配する必要があるのは、bashの(通常は最小の)バージョンがインストールされていることだけです。ほぼすべての近代的な(それほど近代的ではない)UNIXで多くのスクリプトを作成したので、bashへのプログラミングは私の経験においてより確実に一貫しています。

46
j.e.hahn

KornshellとBashの違いはごくわずかです。一方が他方より優れている特定の利点がありますが、違いはわずかです。

  • BASHは、現在のディレクトリを表示するプロンプトの設定がはるかに簡単です。 Kornshellで同じことをするのはハックです。
  • Kornshellには連想配列がありますが、BASHにはありません。さて、最後に連想配列を使用したのは...考えさせてください...決してです。
  • Kornshellはループ構文をもう少し良く処理します。通常、Kornshellループに値を設定し、ループ後に使用可能にすることができます。
  • Bashは、パイプからの終了コードの取得をよりクリーンな方法で処理します。
  • Kornshellには、printコマンドよりもはるかに優れたechoコマンドがあります。
  • Bashにはタブ補完があります。古いバージョン
  • Kornshellにはr historyコマンドがあり、古いコマンドをすばやく再実行できます。
  • Kornshellの構文はcd old newで、ディレクトリとそこにあるCDでoldnewに置き換えます。 /foo/bar/barfoo/one/bar/bar/foo/barというディレクトリにいて、/foo/bar/barfoo/two/bar/bar/foo/barにcdする必要がある場合に便利です。Kornshellでは、cd one twoを実行するだけで済みます。 BASHでは、cd ../../../../../two/bar/bar/foo/barする必要があります。

1990年代にUnixを学んだので、私は古いKornshellの男です。それが当時のシェルでした。 Bashを使用することはできますが、習慣として、Kornshellが持っているいくつかのマイナーな機能を使用しているため、BASHが機能せず、機能しないためにイライラします。そのため、可能な限り、Kornshellをデフォルトとして設定します。

ただし、BASHを学習するように伝えます。 Bashは現在、Linuxと同様にほとんどのUnixシステムで実装されており、KornshellよりもBASHの学習とヘルプの取得に利用できるリソースが単純に多くあります。 BASHで何かエキゾチックなことをする必要がある場合は、Stackoverflowに進み、質問を投稿してください。数分で数十の回答が得られます-そしてそれらのいくつかは正解です!.

Kornshellの質問があり、それをStackoverflowに投稿する場合、答えを得る前に、昼寝から目を覚ます私のようなプライムハッカーを過ぎた古いものを待つ必要があります。そして、その日老人ホームで彼らがプリンを出しているなら、どんな反応を得ることも忘れてください。

BASHは現在選択されている単純なシェルであるため、何かを学ぶ必要がある場合は、人気のあるものを使用することもできます。

122
David W.

私はコーンシェルのベテランなので、その観点から話すことを知っています。

ただし、私はBourne Shell、ksh88、およびksh93に満足しており、ほとんどの場合、どの機能がどの機能でサポートされているかを知っています。 (もう広く配布されていないので、ここではksh88をスキップする必要があります。)

インタラクティブに使用する場合は、ニーズに合ったものを使用してください。実験。インタラクティブな使用とプログラミングに同じシェルを使用できることが好きです。

SVR2のksh88からtcsh、ksh88Sun(重要な国際化サポートを追加)、ksh93に移動しました。私はbashを試しましたが、それは私の歴史を平らにしたので嫌いでした。その後、shopt -s lithistを発見し、すべてが順調でした。 (lithistオプションは、コマンド履歴に改行が保持されることを保証します。)

シェルプログラミングでは、多くの一般的なUNIXコマンドを組み込み関数として使用できるため、一貫したプログラミング言語、良好なPOSIX準拠、および優れたパフォーマンスが必要な場合、ksh93を真剣にお勧めします。

移植性が必要な場合は、少なくとも両方を使用してください。また、適切なテストスイートがあることを確認してください。

シェルには多くの微妙な違いがあります。たとえば、パイプからの読み取りを検討してください。

b=42 && echo one two three four |
    read a b junk && echo $b

これにより、異なるシェルで異なる結果が生成されます。 korn-Shellは、パイプラインを後方から前方に実行します。パイプラインの最後の要素は現在のプロセスで実行されます。 Bashはv4.xまでこの便利な動作をサポートしていませんでしたが、それでもデフォルトではありません。

一貫性を示す別の例:echoコマンド自体は、BSDとSYSV unixの分割により廃止され、それぞれ改行(およびその他の動作)を印刷しない独自の規則を導入しました。この結果は、多くの「構成」スクリプトで引き続き確認できます。

Kshはそれに根本的なアプローチを取り、printコマンドを導入しました。これは、両方のメソッド(BSDの-nオプションと、SYSVの末尾の\c特殊文字)を実際にサポートします

ただし、本格的なシステムプログラミングには、Python、Perlなど、シェル以外のものをお勧めします。または、さらに一歩進んで、人形のようなプラットフォームを使用します。これにより、システムのクラスター全体の状態を監視し、適切な監査で修正できます。

シェルプログラミングは、未知の海で泳ぐようなものです。

すべての言語でプログラミングするには、その構文、インターフェース、および動作に精通している必要があります。シェルプログラミングも同じです。

28
Henk Langeveld

これはちょっとしたUnix対Linuxの戦いです。すべてではないにしても、ほとんどのLinuxディストリビューションにはbashがインストールされており、kshはオプションです。 Solaris、AIX、HPUXなど、ほとんどのUnixシステムにはデフォルトでkshがあります。

個人的には常にkshを使用しています。viの完成が大好きで、すべてにSolarisを使用しています。

4
Kristian

スクリプトの場合、 gotchas をスムーズにするため、常にkshを使用します。

しかし、インタラクティブな使用にはbashの方が快適です。私にとって、emacsキーバインディングとタブ補完が主な利点です。しかし、それは主に習慣の力であり、kshの技術的な問題ではありません。

4
Jon Ericson

私はkshの経験はありませんが、bashとzshの両方を使用しました。非常に強力なファイルグロビング、変数展開修飾子、およびより高速なタブ補完のサポートにより、bashよりもzshの方が好きです。

ここに簡単な紹介があります: http://friedcpu.wordpress.com/2007/07/24/zsh-the-last-Shell-youll-ever-need/

4
Chris AtLee

私の答えは「1つを選んで使用方法を学ぶ」です。どちらもまともなシェルです。 bashにはおそらくもっと多くの機能がありますが、どちらも必要な基本機能を備えています。 bashは最近、より広く利用可能になりました。常にLinuxを使用している場合は、そのまま使用してください。

プログラミングをしている場合、移植性のために単純な「sh」に固執することをお勧めしますが、最近ではbashが非常に広く利用できるようになったため、少しアドバイスするのは少し古臭いでしょう。

補完とシェル履歴の使用方法を学びます。時々マンページを読んで、いくつかの新しいことを学ぼうとします。

3
Incident

@foxxtrot

実際、標準のシェルはBourne Shell(sh)です。 /bin/sh Linux上の実際はbashですが、クロスプラットフォームスクリプトを目指している場合は、元のBourne Shellの機能に固執するか、Perlのような形式で記述する方が良いでしょう。 。

3
Hank Gay

一つには、bashにはタブ補完があります。これだけでも、kshよりも優先させるのに十分です。

Z Shell は、kshのユニークな機能とbashが提供するNiceの優れた組み合わせに加えて、さらに多くのものを備えています。

2
Allen

ほとんどのUNIXシステムで使用可能なkshは、標準に準拠しており、明確に設計されており、バランスが取れています。本、kshのヘルプ、特にO'Reillyの本は十分かつ明確だと思います。バッシュは質量です。 Linuxのrootログインシェルとしては自宅でのみ使用します。

インタラクティブな使用には、Linux/UNIXのzshを使用します。 zshでスクリプトを実行しますが、ほとんどのスクリプト、AIX kshの機能をテストします。

2
MeaCulpa