zshを介してbashを使用する理由はありますか?[閉まっている]


33

なぜzshの代わりにbashを実行したいのか興味があります。つまり、zshはbashと完全に後方互換性があります。誤解しないでください。bashなどは嫌いではありません。zshよりも優れた点があるかどうかを知りたいだけです。

それでは、zshよりもbashを使用する理由は何ですか?


2
ZSHはBASHとの完全な後方互換性がないことを指摘したかっただけです。ZSHでは、配列のインデックス付けは1から始まります。BASHでは、配列のインデックス付けは0から始まります。他にも違いがありますが、これを指摘したかったのです。
チャールズアディス

回答:


29

2つの理由が思い浮かびます。

まず、実際にどこでも利用可能です。zshがインストールされていないLinuxシステム(この場合はCentOS 4.x)がいくつかあります。同様に、Solaris 2.6以上、HP-UX 10以上、および同様にきびきびしたバージョンのAIXなどの古いシステムに触れる必要があります。したがって、私はこれらのコンピューターでbashを使用する必要があります。1か月にわたって数百台ではなくても数十台の個々のコンピューターに触れ、インターフェイスの一貫性を保つために、デフォルト。

第二に、それは事実上どこでも利用可能です。これは、bashシェルスクリプトを記述でき、他の場所に転送したときに機能することを99%確信できることを意味します。

はい、これらの理由は表面的には同じですが、その背後にある理由は異なります。


2
HPUXでksh88 / ksh93を使用したことを思い出しますが、bashをインストールすることはできませんでした。
ズレミニ

24

通常、bashはすべてのシステムに付属していますが、zshには付属していません。私はzshが大好きですが、このため、インタラクティブな使用にはzshを使用しますが、すべてのスクリプトにはBashを使用します

これにより、bash互換(setopt SH_WORD_SPLIT?)


3
それはあなたが言うすべてのGNU / Linuxシステムでしょうか?
andol

2
OS / Xとbsdに付属していることがわかりました。他の* nixの経験はあまりありませんが、(最近のバージョンの)通常bashがありませんか?
カイルブラント

1
古いSolarisバージョンにはbashが含まれていませんでした。通常、Bourneがスクリプトのシェルであることに依存する必要がありました。これはしばらくの間そうではありませんでしたが、いくつかの大企業ではまだそれに遭遇するかもしれません。
user5336 09

3
異なるBSD:sである必要があります。少なくともOpenBSDおよびFreeBSDでは、bashをports / packagesとは別にインストールする必要があります。
andol

andol:これらは私が使っていたものです。私は間違って覚えておく必要があります。
カイルブラント

13

zshは完全にbashと互換性がありません。さまざまな違いがあります。新しいzshはbashとより互換性があります(=〜がサポートされ、execには追加のフラグオプションなどがあります)が、完全な互換性は「エミュレート」の下でも目標ではありません。

たとえば、bashの部分文字列は$ {foo:offset:len}ですが、zshでは$ foo [start、end]であり、これは1つの簡単な例です。

zshはtcshとkshの影響を受けたシェルで、独自の方法で多くのことを行います。POSIXの互換性は明らかに目標ではありませんが、開発者はPOSIXに近づけるオプション/エミュレート動作を追加するパッチに敏感です。しかし、シェルの力を実際に使い始めると、bashよりも書き込み専用のスクリプトを作成し始めます。

bashはPOSIX sh + ksh + pedanticismであり、一部の機能はzshからコピーされました。書き込み専用のスクリプトもありますが、演算子があまり強力ではないため、zshの簡潔さを使用せずに読みやすくなる可能があります(空白の分割を避けるためのすべての引用を除き、愚かな kshスタイルの$ arrayは最初に意味します)配列のすべての要素ではなく、配列の要素など)。

いずれかのシェルの力を最大限に活用するスクリプトを書くことは、制約された環境にいる場合を除き賢明ではありません(たとえば、システムのrcスクリプトを書く、FSがマウントされないなど)。理想としては、他の人がそれを維持できるようにしたい場合は、Bourne sh以外の表現力が必要な大きさであれば、Perl / Python / Ruby / whateverを使用してください。対話型シェルに関連するもの(タブ補完プログラミングなど)のために、シェルのものを保持します。

zshではなくbashを使用しません。単純なスクリプトにはzshを介してbare shを使用するか、連想配列に適切な演算子がある言語に切り替えます(zshとは異なり、それらは再び「簡潔」です)。既存の実績のあるスクリプトを拡張するためにその小さな機能が必要であり、今それを書き換える時間がない場合、shスクリプトをbashに切り替えることができます。


6
nb:互換性のために、zshで$ {foo:offset:len} サポートされるようになりました。
フィルP

6

私のアドバイス:絶対的な移植性を求めているなら、Bourneシェルルールを使用して記述し、Kornシェル拡張機能さえ気にしないでください。前述のように、それはいくつかの古い「大きな箱」であり、GNUシェルがまったくありません。

Bashはすでに「多すぎます」。職場にはzshを好む友人がいますが、それが正確に何をするのかわかりません。

とにかく、Bourne(または「bourne again」)シェルに書き込むか、または少数の特定のボックスに対してカスタムスクリプトを実行する場合は、「shell hell」を完全にスキップして、perlまたはpython(または何でも)を使用して書き込みます。ローカルにインストールされているお気に入りのインタープリターです)。


5

上記の移植性の理由に加えて、bashはまだ機能を追加している可能性があります。

たとえば、bash v4.x +が導入されました:

  • 再帰的グロビング:

    rm -f ** / *。log

  • autocd:

    「cd / tmp」ではなく「/ tmp」と入力します


2
bashがzshから機能をコピーすることは、bashを使用する理由ですか?
qqx

5

ちなみに、bashは事実上どこにでもあると何度も言われているので、それを使用して移植可能なスクリプトを記述しますが、これは誤りです。

ナンセンス。関心のあるすべてのシステムにBASHがあることがわかっている場合、それは完全に合理的なステートメントです。BASHには、POSIX shで合理的にエミュレートできない多くの便利な機能があります。POSIX以外の機能を軽んじて使用するのは良い考えではありませんが、本当に必要なときにそれらを使用することは問題ありません。

移植性は絶対的なものではありません。他のものと同じように、あなたがそれをどこまでとる必要があるかは議論の余地があります。たとえば、FedoraはRPMパッケージのビルドにシェルコマンドを使用し、Fedoraパッケージガイドラインでは、すべてのパッケージをFedoraでネイティブにビルドする必要があるため、BASHのすべての機能を使用しても問題ないと述べています。理論的には、BASHを使用しない他のディストリビューションはソースRPMを再利用したい場合がありますが、「ALWAYS UZE POSIX !! 1」マントラではなく実用性に基づいて移植性を決定しました。

ZSHがデフォルトのシェルとして受け入れられていないのは、単に中途半端なアイデアの広大な混乱だからです。


2
zshのどの機能やアイデアが中途半端だと思うか、そしてその理由を説明できますか?
ファンロール

2

ところで、あなたはここで何度も言われているbashので、ポータブルスクリプトを記述するためにそれを使用し、実質的にどこにでも発見されたが、偽です

移植可能なUNIXスクリプトを記述する正しい方法は、すべての* nixシステムにあるsh、使用することです

他のすべてのシェルshは、毎日のインタラクティブなツールです。

来たときbashVS zsh- bash以上にバンドルされている*nixesよりもzsh、ので、ここでシステムに追加のソフトウェアをインストールするの欠点を来る-あなたはそれを維持する必要があります。一部の人々はzshの「クールな機能」を愛しているため、その代価を支払うのが好きですが、そうでない人もいます。


2
shの多くの最新の実装は、bashへの単なるリンクです。
user9517はGoFundMonicaを

2
@Iain Ubuntuはデフォルトでダッシュを使用します。bash であっても、shとして実行すると互換モードが有効になりますsh
mgorven

2

別のポイント:

多くのプログラムは、デフォルトでクールなbash補完を提供します。私にとっては、切り替えない理由です。

[2013年7月に追加]上記のコメントから数年後にzshを使用した後、タブ補完(組み込みのものであっても、サードパーティの修正なし)が素晴らしいと言わなければなりません。 。:)。


3
私はZSHでタブ補完して、同様ZSHでその作品を考えて、私はプログラムの特定の引数の多くを得る...
カイル・ブラント

面白い。bash補完ファイルはzshで動作するのですか、それとも一部のプログラムにzsh固有の補完機能があるのですか?まだ、bsh補完ファイルの標準レイアウトがいくつかあり、zshは自動的に検討する場合としない場合があります。zsh configを微調整して動作させましたか?
ヴォイチェフカチュマレク

@Wojciech Kaczmarek:19.3はzsh.sourceforge.net/Doc/Release/zsh_19.htmlから欲しいと思います。正直なところ、....私はちょうど私がオンラインで見つける.zshrcを食い物に、実際にそれを理解するために時間がかかったことはありません:-)しかし、それはがち、grepを、などのようなプログラムからのコマンドライン引数を完了します
カイルブラント

5
bashのタブ補完は、zshの古いタブ補完システムに非常に似ています。これは、zshからbashにコピーされたアイデアの1つです(bashからzshにコピーされたアイデアもあります)。「bashcompinit」を実行し、zsh内で「complete」および/または「compgen」コマンドを使用することにより、zshでbash用に記述された完了スクリプトを使用できます。これは、bash機能がzshエミュレートできます。そのため、コマンドにはbash完了が付属しているため、bashに切り替える理由はありません。
フィルP
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.