bash、zsh、tcsh、shなどの違いは何ですか?どちらを使用すればよいですか?

ベストアンサー

これらはすべてシェルであり、言及しなかったものは他にもたくさんあります。どちらを使用するかは個人的な好みの問題です。

最初のシェルはボーンシェル(またはsh)でした。長い間Unixのデフォルト。その後、Unixの主要な派生物が登場し、 Cシェル(またはcsh)と呼ばれる新しいシェルが最初から作成されました。その後、老朽化し​​たBourne Shellの後に、互換性がありながらはるかに強力な Korn Shell (またはksh)が続きました。利用可能なシェルは通常、Bourne / Korn Shell派生物(bash)、C Shell派生物またはクローン(tcsh)、または「その他」(zshなど)のいずれかに分類されます。

あなたが言及したものだけでなく、から選択してください。 GNUbashはBourne / Korn Shellキャンプに分類され、今日のさまざまなUnixおよびLinuxバリアントのデフォルトシェルです。 UnixまたはLinuxでシェル端末を使用したことがある場合は、これである可能性があります。BourneShell(sh)が本当に本当に必要な場合は、無料で利用できるようになっていると思いますが、十分な機能がないため、一般的に敬遠されています。 Korn Shellは下位互換性があり、クローン(mksh)および最近リリースされたオリジナル(ksh)の形式でも無料です。

C Shellには、オリジナルcshの拡張クローンであるtcshがあります。 。cshは前進とは見なされておらず、ユーザー数も少ないため、cshクローンの数は少なくなります。ただし、Unixの多くのBSDバージョン(FreeBSDなど)では、デフォルトのシェルとしてcshが使用されます。

sh / kshまたはcshと互換性のないバリアントがありますが、ニッチシェルになる傾向があります。この分野での私のお気に入りは、Scheme Shell(scsh)とPlan 9 shell rcですが、これらはデフォルトでUnixまたはLinuxにインストールされることはなく、前者はかなり大きいです。 zshもこの「その他」のカテゴリに分類されます。

私の推奨事項は3つあります。まず、システムでデフォルトのシェルを試してください。ほぼ確実にGNUbashです。 Bashはどこにでもあり、BourneShellおよびKornShellプログラムを非互換性なしで読み取って実行します。次に、本当に試したい各シェル(zshやtcshなど)を試し、しばらくの間それを操作して、ニーズを満たしているかどうかを確認します。最後に、好みに合ったものを使用してください。

使用するシェルでスクリプトを作成する必要はありません。私はCシェルをインタラクティブに使用しましたが、プログラミングを拒否しました(すべてのスクリプトでKornシェルを使用しました)。最後に、ある日、kshに飛び込み、振り返ることはありませんでした。

これでの私の個人的なお気に入りポイントは、 mksh (拡張機能のないKorn Shellクローン)-または完全なKornShell互換性を備えたGNUbash-または rc 、Unixの後継となるはずだった新しいPlan 9オペレーティングシステムのシェル(これは実現していませんが)。

回答

何に適していますか?

基準は何ですか?

個人的には bash をお勧めします。これは、LinuxおよびMacOSXシステムのデフォルトであり Cygwin を介して、他のすべての形式のUnixおよびMSWindowsですぐに利用できます。 Linux用Microsoft™Windowsサービス」(Ubuntu bash サポートレイヤー/サブシステム)。

基本的に、何年にもわたって多くの異なるシステムを運用する場合、抵抗が最も少ないパスです…そして、OSベースからの逸脱を最小限に抑えて、新しく再イメージ化されたシステムまたは新しく起動されたインスタンスに頻繁にアクセスします(スケーリングされたWeb /アプリサーバーファームでは一般的です)。 Kornシェルに十分近いため、セマンティクスが異なるコーナーケースを見つける人はほとんどいません。 (ほとんどのユーザーは、 ash dash などの最小限のBourneシェルクローンの違いに気付かないでしょう。 span>と bash が追加する機能は、 ksh の違いを区別することができません。 span>と bash

zsh がおそらく最も強力ですシェルの使用とカスタマイズに真に情熱を注いでいる人に最適です。シェルを使用することの欠点は、すべての拡張機能とカスタマイズ機能を備えているため、ユーザーが他のシェルの使用に戻るのにイライラする可能性があることです。 zsh が(まだ)インストールされていないシステムでの問題のデバッグ—これは現代の環境のops / sysadminsの人々がかなり頻繁に行うことです。また、同僚と協力したり、同僚を指導したり、シェルプロンプトで何かを表示したり、 GNU画面 tmux とのセッション。

Kornシェル ksh は、 bash のいくつかの細かい詳細…しかし、どこにでもフェッチ、インストール、構成する価値があるほどではありません。

ksh は、 bash が追加する前に、長年にわたって「連想配列」(ハッシュ/辞書)をサポートしていました。 (数年前に bash に追加されただけで、たとえばMacOS Xにデフォルトで付属しているバージョンにはまだ含まれていません)。したがって、通常は、シェルスクリプトで連想配列を使用しないのが最善です。その機能が必要だと思われる場合は、通常、Python、Ruby、Perl、TCL / 希望、またはその他の多くの汎用スクリプト言語に切り替えるのが最善です。 。その1つの機能のためだけに(運用オーバーヘッドの観点から)別のシェルに切り替えることで得られるものはそれほど多くありません。

ksh コプロセス

他の注目すべき違いは、説明が必要なものだけです。次のシェルコマンドについて考えてみます。

unset foo; echo bar | read foo; echo "$foo"

これは、Bourne互換のシェルで完全に有効です。ただし、さまざまなシェルでは動作が異なります。文字列「bar」(および新しい行)を出力するか、空白行のみを出力します。

bash 後者は、 ksh zsh が前者の方法で実行されます。 「foo」シェル変数は、現在のシェルに設定されます。私の意見では、これが好ましいセマンティクスです。

しかし、これはコーナーケースです。私の知る限り、UnixシェルのPosix仕様ではカバーされていません。したがって、動作が実装に依存するという事実はバグではありません。これは、シェルの専門家が認識し、テストまたは回避する必要があるものにすぎません。

この動作の理由は、シェルの「パイプ」演算子がプロセス間通信であるためです。機構。シェルはサブシェルを作成する必要があります。これは、親プロセスのメモリの独自のコピーを実行するサブプロセスです。ただし、任意の実装でコマンドを解析し、サブシェル内のパイプシンボルの前(左側)の部分を実行できます( ksh および zsh )またはパイプの後(右側)( bashによって行われるように、 very ksh の古いバージョン(1983リリースより前?) および古いBourneシェルとほとんど ash dash などのクローンの1つ。

1つの作業回避策は、コマンドグループ化を使用して、パイプの後のすべてのコマンドが「スコープ内」にあり、読み取りが次のように組み込まれていることを確認することです。

unset foo; echo bar | { read foo; echo "$foo"; }

(ちなみに、この例では、 bash spanに存在した微妙なバグが明らかになっています。 > 1.4より前で、その後修正されました。パーサーは{}文字とトークンを処理するために使用されていました。 ()(括弧)のようにry。そのため、以前はエコー「$ foo」の後にセミコロンを省略してもかまいませんでした。これは技術的には仕様からの逸脱でした。問題は、何百万人もの人々が bash を使用し、中括弧を閉じる前にコマンドを終了する必要がないという仮定に基づいてスクリプトを書いていたことです。セミコロンまたは改行。したがって、これらの古いシェルスクリプトの一部は、10年以上経ってもまだこのバグを示しており、シェルを見つけて修正するのに十分な知識を持っている人はほんの一握りです。

インタラクティブな使用については、 bash は明らかに ksh より優れていますが、おそらく zsh は、非常にトリッキーな拡張機能とカスタマイズを学習して使用することに専念する人向けです。

bash プログラム可能な[Tab]補完と GNUリードラインライブラリをサポートし、キーバインド、コマンドライン編集、コマンド履歴へのアクセスを非常に柔軟に制御します。 ksh には、比較的制限された fc コマンド( bash は、「修正コマンド」の)もサポートします。つまり、履歴からアイテムを選択し、好みのテキストエディターでプルアップして、編集した一時ファイルの内容を終了時に自動的に実行します。

ただし、 bash はそれをサポートし、独自の emacs または vi 履歴へのアクセスと編集、および古い csh ! (bang)演算子も同様です。

bash vi 編集をサポートしますモード( set -o vi )は、正しく思い出せば、 ksh spanのデフォルトでした。 > 93.ただし、 bash はデフォルトで emacs モード( set -o emacs )。さらに、もちろん、 bash bind コマンドを使用して任意のコマンドを再バインドすることもできます多数の編集および履歴操作機能のいずれか、またはコマンドラインに配置したいテキストに展開するマクロへのキー。

さらに bash には、想像を絶するほど微妙で複雑なことを実行できる多くの「魔法の」環境変数があります。たとえば、 PROMPT\_COMMAND 変数を設定して、 bash が実行されるたびにカスタムフックを実行できます。そのプロンプトを提示しようとしています。したがって、魔法の.dot\_file をチェックして、現在のディレクトリに基づいて実行中のシェルを再カスタマイズしたり、プロンプト文字列と端末画面の色をリセットしたりできます。時刻に基づいて、またはWebサイトにクエリを実行し、…ほぼすべてに基づいてコマンドを自動的に実行します。

(このフックを使用して、作業ディレクトリに移動するだけでPython仮想環境を自動的にアクティブ化しました。たとえば)。

tcsh (またはその祖先である csh )それならあなたは少しニッチにいます。 EDA(電子設計自動化)の分野では、 csh スクリプトがよく見られます。しかし、これは歴史の偶然であり、その分野で働くほとんどの人は、インタラクティブな使用に tcsh を使用していません。

シェルもニッチです。私はそれについて意見を述べるのに十分にそれを使用したことがありません、そしてそれは確かに十分にカラフルです。しかし、それが本当に広範囲の支持者を育てる前に、それは鍬に非常に厳しい列になるだろうと思います。 Apple™がMac™システムのデフォルトシェルとして出荷を開始しない限り、当面の間そのニッチにとどまる運命にあるでしょう。

だから、私が主張したことを願っています。 「何が最善か…」(合理的な代替手段があるほとんどすべてのもの)を尋ねる意味はあまりありません。

Unixコマンドシェルの場合、ボーン互換シェル間の違いは次のとおりです。専門家だけがそれらを区別できるほどマイナーであり、それらにはトレードオフがあり、最終的にはかなり主観的な好みに要約されます。 zsh の設定に情熱を注いでいる同僚や、気を配っている同僚がいます。私は、最も簡単に利用できる選択肢に自分自身を適応させた中間のどこかにいます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です