質問

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

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

役に立ちましたか?

解決

バッシュ。

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

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

他のヒント

Kornshell と Bash の違いは最小限です。どちらかが他方よりも優れている点はありますが、違いはごくわずかです。

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

私は 1990 年代に Unix を学び、当時は Unix が好まれていたシェルだったので、古い Kornshell マニアです。Bash を使用することはできますが、BASH にはない Kornshell のマイナーな機能を習慣的に使用してしまい、Bash が動作しないため、時々イライラします。したがって、可能な限り、Kornshell をデフォルトとして設定します。

ただし、BASH を学習するように言いたいと思います。Bash は現在、Linux だけでなくほとんどの Unix システムにも実装されており、BASH を学習したりサポートを得たりするために利用できるリソースは Kornshell よりも単純に多くあります。BASH で何か珍しいことをする必要がある場合は、Stackoverflow にアクセスして質問を投稿すると、数分で十数件の回答が得られ、そのうちのいくつかは正しいものもあります。

Kornshell に関する質問があり、それを Stackoverflow に投稿した場合、回答が得られるまで、私のような過去の第一人者ハッカーが昼寝から目覚めるまで待たなければなりません。そして、その日に老人ホームでプリンを提供していても、何も反応がないことを忘れてください。

BASH は現在、単にシェルとして選ばれているだけなので、何かを学ばなければならない場合は、人気のあるシェルを選択したほうがよいでしょう。

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

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

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

私は SVR2 の ksh88 から tcsh、ksh88sun (大幅な国際化サポートを追加しました)、そして ksh93 に移行しました。私はバッシュを試してみましたが、それが私の歴史を平らにしたのでそれを嫌っていました。それから私は発見しました shopt -s lithist そしてすべてうまくいきました。( lithist オプションは、ニューラインがコマンド履歴に保存されていることを保証します。)

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

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

シェル間には微妙な違いがたくさんあります。たとえば、パイプからの読み取りを考えてみましょう。

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

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

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

Ksh はこれに対して根本的なアプローチを採用し、 print このコマンドは、実際には両方の方法をサポートしています ( -n BSD のオプションと後続の \c SYSV の特殊文字)

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

シェル プログラミングは、未知の海で泳ぐようなもの、あるいはそれよりさらに悪いことに似ています。

どの言語でプログラミングしても、その構文、インターフェイス、および動作に精通している必要があります。シェルプログラミングもそれと変わりません。

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

簡単な紹介は次のとおりです。 http://friedcpu.wordpress.com/2007/07/24/zsh-the-last-shell-youll-ever-need/

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

個人的には、私は常に ksh を使用しており、vi 補完が大好きで、ほとんどすべてのことに Solaris を使用しています。

スクリプトの場合、私はいつも使用します キシュ 滑らかになるから 落とし穴.

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

@foxtrot

実は、標準シェルは Bourne シェル (sh). /bin/sh Linux では実際には bash, ただし、クロスプラットフォームのスクリプトを目指している場合は、元の Bourne シェルの機能に固執するか、次のようなもので記述したほうがよいでしょう。 perl.

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

プログラミングをしている場合、移植性を考慮してプレーンな 'sh' を使用することは良い習慣ですが、最近では bash が非常に広く利用できるようになっているため、そのようなアドバイスは少し時代遅れかもしれません。

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

まず、bash にはタブ補完があります。これだけでも、私は ksh よりもこちらを好むのに十分です。

Zシェル には、ksh のユニークな機能と bash が提供する優れた機能がうまく組み合わされており、それに加えてさらに多くの機能が含まれています。

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

対話的に使用するには、Linux/UNIX 上の zsh を好みます。私は zsh でスクリプトを実行しますが、ほとんどのスクリプトの機能は AIX ksh でテストします。

Bash がベンチマークですが、それは主に、Bash が世の中のすべての *nix にインストールされていることが十分に確信できるためです。スクリプトを配布する予定がある場合は、Bash を使用してください。

残念ながら、シェル間の実際のプログラミングの違いに実際に対処することはできません。

バッシュ Linux の標準です。
私の経験では、ksh や csh よりも bash の方がヘルプを見つけるのが簡単です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top