私は*nixに不慣れではありませんが、最近はプロンプトで多くの時間を費やしています。私の質問は、KornShell(ksh)またはBash Shellを使用する利点は何ですか?どちらか一方を使用することの落とし穴はどこにありますか?
純粋にスクリプトを作成するのではなく、ユーザーの観点から理解しようとしています。
Kornshell と Bash の違いはごくわずかです。どちらにも利点がありますが、違いはごくわずかです。
print
コマンドよりもはるかに優れたecho
コマンドがあります。r
履歴コマンドがあり、古いコマンドをすばやく再実行できます。cd old new
で置き換えold
られます。new
というディレクトリにいて、そこに cd する必要がある場合に便利/foo/bar/barfoo/one/bar/bar/foo/bar
です。BASH では、./foo/bar/barfoo/two/bar/bar/foo/bar
cd one two
cd ../../../../../two/bar/bar/foo/bar
私は 1990 年代に Unix を学んでおり、当時はそれがシェルの選択だったので、古いコーンシェル派です。私は Bash を使用できますが、Kornshell にはあり、BASH にはなく機能しないいくつかのマイナーな機能を習慣的に使用しているため、Bash に不満を感じることもあります。そのため、可能な限り Kornshell をデフォルトとして設定しています。
ただし、BASH を学習するように伝えます。Bash は現在、ほとんどの Unix システムと Linux に実装されており、BASH を学習してヘルプを得るために利用できるリソースは、Kornshell よりも単純に多くあります。BASH で特殊なことをする必要がある場合は、Stackoverflow にアクセスして質問を投稿すると、数分で多数の回答が得られます。そのうちのいくつかは正しいものです!.
Kornshell に関する質問があり、それを Stackoverflow に投稿した場合、回答を得る前に、私のような主要なハッカーが昼寝から目覚めるのを待つ必要があります。そして、その日、彼らが老人ホームでプリンを出していても、何の反応も得られないことを忘れてください.
BASH は現在選択されているシェルであるため、何かを学ぶ必要がある場合は、人気のあるシェルを使用することをお勧めします。
バッシュ。
さまざまな UNIX および Linux 実装には、さまざまなソース レベルの ksh 実装があり、その一部は実際の ksh であり、一部は pdksh 実装であり、一部は「ksh」パーソナリティを持つ他のシェルへの単なるシンボリック リンクです。これにより、実行動作に奇妙な違いが生じる可能性があります。
少なくとも bash を使用すると、単一のコード ベースであることを確認できます。心配する必要があるのは、インストールされている bash の (通常は最小の) バージョンだけです。ほとんどすべての最新の (そしてそれほど最新ではない) UNIX で多くのスクリプトを作成してきたので、私の経験では、bash へのプログラミングはより確実に一貫しています。
私はコーンシェルのベテランなので、その観点から話すことを知っておいてください。
ただし、私はBourneシェル、ksh88、およびksh93に慣れており、ほとんどの場合、どの機能がどの機能でサポートされているかを知っています。(ksh88はもう広く配布されていないため、ここではスキップする必要があります。)
インタラクティブに使用するには、ニーズに合ったものを選択してください。実験。インタラクティブな使用とプログラミングに同じシェルを使用できるのが好きです。
私はSVR2のksh88からtcsh、ksh88sun(重要な国際化サポートを追加)およびksh93に移行しました。私はbashを試してみましたが、それが私の歴史を平らにしたので嫌いでした。それから私は発見shopt -s lithist
し、すべてが順調でした。(このlithist
オプションは、改行がコマンド履歴に保持されることを保証します。)
シェルプログラミングの場合、一貫性のあるプログラミング言語、優れたPOSIX準拠、および優れたパフォーマンスが必要な場合は、ksh93を強くお勧めします。これは、多くの一般的なUNIXコマンドを組み込み関数として使用できるためです。
移植性が必要な場合は、少なくとも両方を使用してください。そして、あなたが良いテストスイートを持っていることを確認してください。
シェルの間には多くの微妙な違いがあります。たとえば、パイプから読み取ることを検討してください。
b=42 && echo one two three four |
read a b junk && echo $b
これにより、シェルごとに異なる結果が生成されます。korn-shellは、パイプラインを後ろから前に実行します。パイプラインの最後の要素は、現在のプロセスで実行されます。Bashはv4.xまでこの便利な動作をサポートしていませんでしたが、それでもデフォルトではありません。
一貫性を示す別の例:echo
BSDとSYSV unixの間の分割によって廃止され、それぞれが改行(およびその他の動作)を出力しないための独自の規則を導入したコマンド自体。この結果は、多くの「構成」スクリプトで引き続き確認できます。
Kshはそれに根本的なアプローチを取り、print
実際に両方のメソッド(-n
BSDのオプションと\c
SYSVの末尾の特殊文字)をサポートするコマンドを導入しました。
ただし、本格的なシステムプログラミングには、PythonやPerlなどのシェル以外のものをお勧めします。または、さらに一歩進んで、puppetのようなプラットフォームを使用します。これにより、システムのクラスター全体の状態を適切に監査して監視および修正できます。
シェルプログラミングは、未知の海で泳ぐようなものです。
どの言語でもプログラミングするには、その構文、インターフェース、および動作に精通している必要があります。シェルプログラミングも例外ではありません。
これはちょっとした Unix 対 Linux の戦いです。すべてではないにしても、ほとんどの Linux ディストリビューションには bash がインストールされており、ksh はオプションです。Solaris、AIX、HPUX などのほとんどの Unix システムには、デフォルトで ksh があります。
個人的には、常に ksh を使用しています。vi 補完が大好きで、ほぼすべてに Solaris を使用しています。
スクリプトの場合、gotchasをスムーズにするため、常にkshを使用します。
しかし、インタラクティブな使用にはbashの方が快適だと思います。私にとっては、emacsのキー バインドとタブ補完が主な利点です。しかし、それは主に習慣の力であり、 kshの技術的な問題ではありません。
ksh の経験はありませんが、bash と zsh の両方を使用しました。非常に強力なファイル グロビング、変数展開修飾子、高速なタブ補完をサポートしているため、bash よりも zsh を好みます。
ここに簡単な紹介があります:http://friedcpu.wordpress.com/2007/07/24/zsh-the-last-shell-youll-ever-need/
一つには、bashにはタブ補完があります。これだけで、kshよりも好むようになります。
Zシェルには、kshの独自の機能と、bashが提供する優れた機能がうまく組み合わされており、さらに多くのものが追加されています。
@フォックストロット
実は、標準シェルはボーンシェル( sh
)です。しかし、クロスプラットフォーム スクリプトを目指している場合は、元の Bourne シェルの機能に固執するか/bin/sh
、.bash
perl
私の答えは、「1 つ選んで使い方を学ぶ」です。どちらもまともなシェルです。おそらく bash にはさらに多くの機能が備わっていますが、必要な基本機能はどちらも備えています。最近では、bash がより一般的に利用できるようになっています。常に Linux を使用している場合は、そのまま使い続けてください。
プログラミングをしている場合は、移植性のために単純な「sh」に固執することをお勧めしますが、最近では bash が非常に広く利用可能になっているため、少しのアドバイスはおそらく少し古くなっています。
補完とシェル履歴の使用方法を学びます。ときどきマンページを読み、いくつかの新しいことを学ぼうとします。
ほとんどの UNIX システムで使用できる ksh は、標準に準拠し、明確に設計され、バランスの取れたものです。本、kshのヘルプ、特にO'Reillyの本で十分で明確だと思います。バッシュは塊です。Linuxのルートログインシェルとして自宅のみに保管しています。
インタラクティブに使用する場合は、Linux/UNIX で zsh を使用することをお勧めします。スクリプトは zsh で実行しますが、ほとんどのスクリプトと関数は AIX ksh でテストします。
Bashはベンチマークですが、これは主に、すべての*nixにBashがインストールされていることを合理的に確信できるためです。スクリプトの配布を計画している場合は、Bashを使用してください。
残念ながら、シェル間の実際のプログラミングの違いに実際に対処することはできません。
Bashは Linux の標準です。
私の経験では、ksh や csh よりも bash の方がヘルプを見つけやすいです。