メインストリームの* NIXシェルの基本的な違いは何ですか?[閉まっている]


52

メインストリームの* NIXシェルの基本的な違いは何ですか?その一部はおそらくユーザーの好みに依存することを理解していますが、bashを使用したことがあるだけで、別のシェルが役立つ場所を知りたいと思っています。

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

回答:


52

インタラクティブな使用のために、bashzshの 2つの主要な候補に加えて、ストラグラーtcshとnewcomer fishがあります。

  • BashはGNUプロジェクトの公式シェルであり、ほとんどのLinuxディストリビューションのデフォルトシェルです。基本インストールの一部として適切なインタラクティブシェルが付属していない他の大学では、bashが人々が選択する傾向があると思います。参照してくださいbashがどこにでもあるのはなぜ?(多くの履歴情報があります)。

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

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

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


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

  • Unix風のふりをするものには、Bourneから派生したシェルとしてがあり/bin/shます。POSIXに準拠して/bin/shいない場所には、まだいくつかの商用ユニセがあります。

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

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

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

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

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


4
スクリプティングでは、ダッシュをターゲットにします(bashの高度な機能が必要でない限り)。これには最小限の機能セットがあり、最大限の互換性のためにposixの苦情です。(そして、それは小さくて軽いです)
hildred 14

素晴らしいドキュメント!2つのメモ。第1に、Solarisは「/ bin / shがPOSIXに準拠していない周辺の商用製品」の1つです。具体的には、jsh(Javaシェルではない!)を使用します。これには、${VAR#foo}andなどの変数置換がありません${VAR%bar}
アダムカッツ

第二には、tcsh(両方の導入を見た〜90年代半ばの前に彼らのトリックを学んだUNIXユーザーの間でかなり人気があるbashzsh特に古いUNIX +の中で)、Cとの生活を始めた開発者は、csh(リマインダー、Ccsh用スタンドCの言語、ボーンスタイルのシェルとの違いのインスピレーションでした)。また、有害と考えられるCshプログラミングも参照してください。これは、POSIX ディープマジックに関するヒント(anti-csh引数に加えて)でよく使用します。
アダム・カッツ

Mac OS Xは決して「OS / X」ではありません。(そして、zshはどのようにBourneと互換性がありませんか?(まあ、単語を分割しない変数展開のようなものを除いて。)
SilverWolf-モニカの復元

@seaturtle単語分割ではない変数展開は、zshで実行しようとした場合に多くのshスクリプトを壊す大きな違いです(sh / kshエミュレーションモードでzshを実行しない限り)。
ジル 'SO-悪であるのをやめる'

27

シェルには、sh(bashなど)とcsh(tcshなど)の2つの基本的なフレーバーがあります。インタラクティブな使用のために、それは主にあなたが慣れているものに帰着します。私は何年もの間cshを使用し、次にtcshを使用してきましたが、切り替えに苦労するでしょう。私もbashを使用しましたが、切り替えが必要な理由はないと思います。定期的に使用するマシンでどちらか一方が使用できない場合を除きます。

プログラミングの場合、構文は異なります。シェルを変更するだけでなく、スクリプトの構文も変更する必要があります。スクリプトを作成するには、shまたはbashを使用します。ここで説明しているように、構文はスクリプトの方がはるかに受け入れられます(リンクについてはRiccardo Murriに感謝します。これはbashスクリプトの優れたガイドです。

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


12

昔、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シェル構文を拡張するという考えに基づいて、プログラマーとインタラクティブな使用の両方に多くのことを追加しました。実際にはいくつかのバージョンがあり、バリアントを示すksh88やksh93のようなものはめったに見られないかもしれません。

その後、FSFとGNU OSが登場しました。彼らは、Hurdという名前の独自のUNIX互換OSを作りたいと思っており、より良いシェルを望んでいました。彼らはBourne Again SHellのためにbashと呼ばれました。この頃、POSIXルールが登場し POSIXシェルを作りたかったのです。彼らは、Bourneシェルの構文とKornシェルの改良を取り入れ、さらにtcshから対話型機能を盗み出し、拡張しました。Linuxの事実上のシェルになったため、非常に一般的です。

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

シェルを選択する場合は、bashまたはzshを選択します。bashは、zshよりもいくつかの場所にある可能性があります。zshはより強力ですが、bashは私にとっては問題ありません。実際の/ bin / sh Bourneシェルは、歴史的な理由だけで使用されています。bashには、kshが提供しなければならないことがほとんどすべてあります。構文はcshまたはtcshよりも簡潔であり、いずれかよりも優れた機能を備えています。

スクリプトを変換するには、何から何に依存します。Bshシェルスタイル(sh、ksh、bash、zsh)とcshスタイル(csh、tcsh)のやり取りは困難です。古いものから新しいもの(/ bin / sh => bash、/ bin / ksh => zsh)に移動するのは、他の方法よりも簡単です。


csh-whynotページは1995年9月に書き戻されたことに注意してください(上部のバージョンタグを確認してください)。わかりませんが、それから18年で多くのことが変化することを期待しています。
CVn

8

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

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

1つのボーンシェル派生物で記述されたほとんどのことは、おそらく他のものでも機能します。Bourneシェルで書かれたほとんどのものは、おそらくcshまたはtcshで実行するように変更する必要があります。

個人的には、使い始めたときにkshを使用していました。これは、使用しているシステム上にあったからです。現在、主にbashを使用しています。


1
魚はcshに触発されたシェル
14

1

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

少なくとも以前はzshにはもっと多くのカスタマイズオプションがあると思いますが、かなり長い年使用してから、その安定性と文字エンコードの問題で十分でした。Bashは堅固で、同様の問題が発生することはなく、あらゆる場所にインストールされています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.