なぜzshの代わりにbashを実行したいのか知りたいです。つまり、zshはbashと完全に下位互換性があります。誤解しないでください。私はbashやその他を嫌いではありません。私は本当にそれをzshよりも使用することの利点があるかどうか知りたいです。
では、zshではなくbashを使用する理由は何ですか?
2つの理由が思い浮かびます:
まず、事実上どこでも利用できます。 zshがインストールされていないLinuxシステム(この場合はCentOS 4.x)がいくつかあります。同様に、Solaris 2.6以降、HP-UX 10以降、および同様に不規則なバージョンのAIXなどの古いシステムに触れなければなりません。したがって、私はこれらのコンピュータでbashを使用する必要があります。これは、1か月の間に数百ではなくても数十の個々のコンピュータに触れるためです。インターフェイスの一貫性を保つために、デフォルト。
第二に、事実上どこでも利用可能です。これは、bashシェルスクリプトを記述して、他の場所に転送したときに99%確実に機能することを意味します。
はい、これらの理由は表面的には同じですが、それらの背後にある理由は異なります。
通常、bashはすべてのシステムに付属していますが、zshには付属していません。私はzshが大好きですが、このため、インタラクティブな使用にはzsh、すべてのスクリプトにはBashを使用しています。
これにより、すべてがよりシンプルに保たれることがわかります。bash互換(soptopt SH_Word_SPLIT?)を購入しても、微妙な違いが発生します。
zshは完全にbash互換ではありません。さまざまな違いがあります。新しいzshはbashとの互換性が高くなっています(=〜がサポートされ、execには追加のフラグオプションなどが追加されました)。
たとえば、bashの部分文字列は$ {foo:offset:len}ですが、zshでは$ foo [start、end]であり、これは単なる1つの簡単な例です。
zshはtcshおよびkshの影響を受けたシェルであり、独自の方法で多くのことを実行します。 POSIXの互換性は明らかに目標ではありませんが、開発者は、オプションを追加したり動作をエミュレートしたりしてPOSIXに近づけるパッチに対応します。しかし、実際にシェルの機能を使い始めると、bashよりもさらに書き込み専用のスクリプトの作成を開始します。
bashはPOSIX sh + ksh +知識主義であり、一部の機能はzshからコピーされています。書き込み専用のスクリプトもありますが、演算子の能力が低いため、zshの簡潔さを使用せず、mightより読みやすくなります(空白の分割を避けるためのすべての引用を除いて、- stupid kshスタイルの$ arrayは、配列のすべての要素ではなく、配列の最初の要素を意味します。
制約された環境(たとえば、一部のFSがマウントされていない可能性があるシステムrcスクリプトなど)でない限り、いずれかのシェルの能力を最大限に活用するスクリプトを作成することは賢明ではありません。理想的には、他の人がそれを維持できるようにしたい場合は、ボーンshではない表現力を必要とするほど大きいものには、Perl/Python/Ruby /何でも使用します。インタラクティブなシェルに関連するもの(タブ補完プログラミングなど)のためにシェルのものを保持します。
Zshではなくbashを使用しません。単純なスクリプトの場合は、zshよりも単純なshを使用するか、連想配列に適切な演算子がある言語に切り替えます(zshとは異なり、ここでも、それらは「簡潔」です)。私は可能性がある既存の動作するスクリプトを拡張するためにその1つの小さな機能が必要で、今すぐ書き直す時間がない場合は、shスクリプトをbashに切り替えます。
私のアドバイス:完全な移植性を求める場合は、Bourne Shellルールを使用して記述し、Korn Shell拡張機能を気にしないでください。すでに述べたように、これは、GNUシェルがまったく存在しない、古い「大きな箱」です。
バッシュはすでに「やりすぎ」です。私には仕事でzshを好む友人がいますが、それが何をするのか正確にはわかりません。
とにかく、Bourne(または "bourne again")シェル、または少数の特定のボックスに対してカスタムスクリプトを実行している場合は、「Shell hell」を完全にスキップして、Perlまたはpython(または、ローカルにインストールされたお気に入りのインタープリターが何であれ)。
ところで、bashは事実上どこにでもあると何度も言われているので、bashを使って移植可能なスクリプトを作成するのは誤りです。
ナンセンス。気になるすべてのシステムにBASHがあることがわかっている場合、それは完全に妥当なステートメントです。 BASHには、POSIX shでは合理的にエミュレートできない多くの便利な機能があります。非POSIX機能を軽度に使用することは良い考えではありませんが、本当に必要なときにそれらを使用することは問題ありません。
移植性は絶対的なものではありません。他と同じように、どれだけの距離を取る必要があるかは議論の余地があります。たとえば、FedoraはRPMパッケージをビルドするためにシェルコマンドを使用し、FedoraのパッケージガイドラインはすべてのパッケージはFedoraでネイティブにビルドする必要があるため、BASHのすべての機能を使用しても問題ないと述べています。理論的には、BASHを使用しない他のディストリビューションはソースRPMを再利用したいと思うかもしれませんが、「常にUZE POSIX !! 1」のマントラではなく、実用性に基づいて移植性について決定しました。
ZSHはデフォルトのシェルとしては採用されていません。それは、それが中途半端なアイデアの膨大な混乱だからです。
上記の移植性の理由に加えて、bashがまだ機能を追加している可能性もあります。
たとえばbash v4.x +が導入されました:
再帰的グロビング:
rm -f **/*。log
autocd:
「cd/tmp」の代わりに「/ tmp」と入力します
ところで、ここで何度もbash
がどこにでもあると言われているので、それを使用して移植可能なスクリプトを記述してくださいfalse。
移植可能なUNIXスクリプトを書く正しい方法は、sh
を使用することです。これはすべての* nixシステムにありますです。
sh
を除く他のすべてのシェルは、あなたの日常の対話型ツールにすぎません。
bash
とzsh
を比較すると、bash
がさらにバンドルされています*nixes
はzsh
よりも大きいため、システムに追加のソフトウェアをインストールする場合のデメリットがあります。それを維持する必要があります。一部の人々はzshの「クールな機能」を愛しているので、その価格を支払うのが好きですが、そうでない人もいます。
別のポイント:
多くのプログラムは、デフォルトでクールなbash補完を提供します。私にとってそれは切り替えない理由です。
[2013年7月に追加]上記のコメント以降、zshを数年使用した後、タブ補完(組み込みのものでも、3番目の変更なし)は見事であり、bashによって提供されるものをはるかに超えているように見えます。 :)。