it-swarm-ja.tech

主流の* NIXシェルの基本的な違いは何ですか?

主流の* NIXシェルの基本的な違いは何ですか?また、どのシナリオを使用してどちらか一方を使用するように促される可能性がありますか?一部はおそらくユーザー設定に起因することを理解していますが、私はbashを使用したことがないので、別のシェルが役立つ可能性がある場所を知りたいです。

また、1つのシェルまたは別のシェルの下で実行すると、ユーザー作成のシェルスクリプトに影響がありますか、それとも単にファイルの先頭にあるシェルを変更するだけの問題ですか?私の本能はそれは簡単ではないと言います。

52
conorgriffin

インタラクティブな使用のために、2つの主要な候補 bash および zsh に加えて、ストラグラー tcsh および新参者 fish があります。

  • BashはGNUプロジェクトの公式シェルであり、ほとんどのLinuxディストリビューションのデフォルトのシェルです。ベースインストールの一部として適切なインタラクティブシェルが同梱されていない他のuniceでは、bashは自己強化の「bashはどこにでもあるので、私も使用する」ループで人々が選択する傾向があります。また、 なぜbashがどこでもあるのですか? (多くの履歴情報がある)も参照してください。

  • Zshには、bashのほぼすべての機能と、さらに多くの(便利な!)機能があります。その主な欠点はあまり知られていないことです。これは、実際には、他の誰かがセットアップしたシステムにすでにインストールされている可能性が低く、サードパーティのドキュメントが少ないことを意味します。 使用するzsh機能は何ですか?zshにあり、bashにない機能、またはその逆はありますか? も参照してください。

  • Tcshはかつて(1990年代初頭まで)、その前身のcshと同様に、最高のインタラクティブ機能を備えたシェルでした。これにより、インタラクティブな使用が一般的になりました(ただし、 スクリプトでは使用できません )。 Zshはtcshに追いつき、かなり急速にさらに改善し、bashは(プログラム可能な完了により)2000年代初頭に追いつきましたが、tcshは過去15年間ほとんど進歩していません。したがって、今tcshを学ぶ理由はほとんどありません。

  • 魚は前作よりもきれいにしようとします。それはいくつかのきちんとした機能(より単純な構文、コマンドラインでの構文の色分け)を備えていますが、他には欠けています(作成者が好まないものは何でも)。魚の群れはzshの群れよりもはるかに小さく、その影響はさらに深刻になります。


スクリプトの場合、スクリプトの移植性に応じて、ターゲットにしたい言語がいくつかあります。

  • Unixライクのふりをするものには、_/bin/sh_として Bourne から派生したシェルがあります。 _/bin/sh_が [〜#〜] posix [〜#〜] に準拠していない場所には、まだいくつかの商業的ユニックスがあります。

  • 現在実行中のほとんどすべてのUNIXには、少なくともPOSIX.2-1992に準拠し、通常は少なくとも POSIX:2001 a.k.a. Single Unix v に準拠するsh実行可能ファイルがあります。このシェルは、_/usr/bin/posix_や_/usr/xpg6/bin_などの別のディレクトリにある場合があります。 POSIXエミュレーション層は、それをサポートするのに十分強力であり、魅力的なターゲットとなるほぼすべてのシステムにも存在します。

  • 多くのUNIXシステムには ksh9 があり、POSIX shにはないいくつかの非常に便利な機能(配列、連想配列、拡張グロブ(*(foo)@(foo|bar)、…) 、ヌルグロブ(~(N)foo*)、…)。 Kshは当初商用ソフトウェアでした(いくつかの習慣が定着した後、2000年に無料になりました)。多くの無料のユニックス(Linux、* BSD)は、はるかに古い無料のクローンのみを提供する習慣になりました( pdksh )これらの便利な機能の多くが欠如しています。PdkshはOpenBSDの外部で mksh に置き換わっていますが、mkshでさえすべてのksh93機能の実装には不十分です。今日、 ksh93がどこでも利用できるとは限りません。特にbashが標準であるLinuxではそうです。

  • Bash は常にLinux(一部の組み込みバリアントを除く)で利用可能で、他のunicesでも利用可能です。 ksh93の便利な機能のほとんどを備えていますが、構文が異なる場合もあります。

  • Zsh はksh93とbashの便利な機能のほとんどを備えています。そのコア構文はより簡潔ですが、Bourneと互換性がありません。 macOSを除いて、インストールしていないシステムでzshが利用可能であることを期待しないでください。

  • より高度なスクリプトを作成するには、 Perl または Python を使用できます。これらの言語には、適切なデータ構造、適切なテキスト操作機能、適切なプロセスの組み合わせと通信メカニズム、および利用可能な多数のライブラリがあります。ほとんどのUNIXシステムにはそれらがあり、OSにバンドルされているか、管理者によってインストールされています(PerlとPythonスクリプトが非常に多いため、少なくとも1つもないまれなシステムであるため)それぞれの)。

Shellには、sh(bashなど)とcsh(tcshなど)の2つの基本的な種類があります。インタラクティブな使用の場合、それは主に慣れ親しんだことです。私はcshを使用してから、tcshを何年も使用してきました。慣れているからといって、切り替えるのは大変です。私はbashも使用しており、切り替える理由は特にないと思います。ただし、通常使用しているマシンでどちらか一方が使用できない場合を除きます。

プログラミングの場合、構文は異なります。シェルを変更するだけでなく、スクリプトの構文も変更する必要があります。スクリプトでは、shまたはbashを使用します。 here (リンクのおかげで Riccardo Murri に感謝します。説明は、bashスクリプトの優れた ガイド です。 。

シェルを決定しておらず、スクリプトを作成する予定がある場合は、学習する必要のある量を減らすためだけにbashを使用します。

27
KeithB

AT&TがUNIXを発明した昔、スティーブボーンが書いたボーンシェルがありました。それはかなり基本的なものであり、私たちが今日当たり前と思っている多くのツールが欠けていました。

AT&Tは実際にはUNIXビジネスに属していなかったので、現時点では非常に基本的なOSがBerkelelyによって多少採用され、BSD UNIXにいくつかの変更を加えました。多くの変更の中で、cshと呼ばれる新しいシェルがありました。これには、ジョブ制御のインタラクティブな使用の改善など、shに比べて多くの改善点がありました。残念なことに、彼らはshプログラミング構文を吸い込み、Cコーディングスタイルから独自の(ややひどい)コピーを作成することを決定しました。 (古典的な暴言は http://www.faqs.org/faqs/unix-faq/Shell/csh-whynot/ )ですから、2つの構文がありました。

その後、タブ補完などの機能を追加してCSHを改善しました。これはtcshになりました。CSHを使用している場合、おそらくこれが使用するものです。

AT&Tは、それが完全にUNIXビジネスの外にあるわけではないと判断し、彼らもそれを磨き上げました。 David Korn(ナイスガイ)がKornシェルを作成しました。 Bourne Shell構文を拡張するという考えに基づいて、プログラマーとインタラクティブな使用の両方に多くのことを追加しました。実際にはいくつかのバージョンがあり、ksh88やksh93などのバリアントを示すものはめったに見られない場合があります。

その後、FSFとGNU OSが登場しました。彼らはHurdという名前の独自のUNIX互換OSを作成したいと考え、そのためにより良いシェルを望んでいました。BourneAgain Shellのためにbashと呼びました。POSIXルールちょうどこの頃にやって来て、彼らはthePOSIXシェルを作りたかったのです。彼らはBourneシェルの構文とKornシェルの改良を取り入れて周りを見回しました、さらにtcshからインタラクティブ機能を盗んで拡張します。これはLinuxのデファクトシェルになり、非常に一般的です。

「究極の」シェルになるように書かれたzshもあります。 Linuxの世界でも非常に一般的です。それはbashを拡張しました(そして少し受粉すると、いくつかの新しいことがbashに戻りました)。

シェルを選択する場合は、bashまたはzshを選択します。 bashはzshよりもいくつかの場所にある可能性があります。 zshの方が強力ですが、bashで十分です。本当の/ bin/sh Bourne Shellは歴史的な理由だけで存在しています。 bashには、kshが提供する必要のあるほとんどすべての機能が備わっています。構文はcshやtcshよりも簡潔で、どちらの機能よりも優れた機能を備えています。

スクリプトを変換するには、何を何に変換するかによって異なります。ボーンシェルスタイル(sh、ksh、bash、zsh)とcshスタイル(csh、tcsh)の間の変換は困難です。古いものから新しいもの(/ bin/sh => bash、/ bin/ksh => zsh)への移行は、他の方法よりも簡単です。

12
Rich Homolka

シェルの2つの主要なブランチは、Bourne Shell派生物(sh、bash、ksh、ash、yash、zsh)とcsh派生物(tcshと... uhm ... tcsh)です。

(実際の数値はありませんが)bashが最も広く使用されていると思いますが、ほとんどのLinuxではデフォルトのシェルであるようです。

1つのボーンシェルデリバティブで記述されたほとんどのものが、おそらく他のシェルでも機能するでしょう。 Bourne Shellで記述されたほとんどのものは、おそらくcshまたはtcshで実行するように変更する必要があります。

個人的には、私が使用していたシステム上にあったため、最初にkshを使用しました。今は主にbashを使っています。

8
mazianni

私は長い間、数多くのシェルを使用してきました。超高度なものは何もありませんが、十分なカスタマイズを必要とする実用的なシステム管理者やプログラミング関連のものがたくさんあります。

Zshには、少なくとも以前はもっと多くのカスタマイズオプションがあると思いますが、かなり長い間使用した後、安定性と文字エンコーディングの問題で十分でした。 Bashは堅実で、同様の問題が発生することはなく、どこにでもインストールされます。

1
Ari T