web-dev-qa-db-ja.com

すべてのbashスクリプトは `zsh`と互換性がありますか?

私はbashからzshに切り替えることを考えていますが、bashスクリプトの互換性について心配しています。

すべてのbashスクリプト/関数はzshと互換性がありますか?したがって、それが当てはまる場合、zshはbashの拡張機能にすぎませんか?

75
chrisjlee

スクリプトが#!/bin/bashという行で始まる場合、デフォルトのシェルがzshであっても、bashを使用して実行されます。

Zshの構文はbashの構文に非常に近いことがわかりました。本当に互換性がない場合は注意を払いませんでした。 6年前にbashからzshにシームレスに切り替えました。

60
Huygens

Zshは、適切なエミュレーションモード(emulate shまたはemulate ksh)に配置すると、ほとんどのBourne、POSIX、またはksh88スクリプトを実行できます。 bashまたはksh93のすべての機能をサポートしているわけではありません。 Zshにはbashのほとんどの機能がありますが、多くの場合、構文は異なります。

インタラクティブに使用するシェルは、使用するスクリプトとは無関係です。スクリプトを実行するシェルは、最初の行 Shebang で示されているシェルです。たとえば、スクリプトが#!/bin/bashで始まる場合、bashによって実行されます。

Bashをカスタマイズした場合、.bashrc.zshrcに名前変更することはできません。 2つのシェルの交差部分に固執する限り(交差部分はksh88と pdksh に近い)、いくつかの項目、たとえばエイリアスと関数を共有できます。プロンプトの設定、補完機能、ほとんどのオプションなど、その他のものは完全に書き直す必要があります。

人々が.bashrcまたは.zshrcからソースを取得するスニペットを作成していて、2つのバージョンを維持したくない場合は、bashおよびzsh機能の共通サブセットに固執します。 bashのプログラミング機能。コード全体を関数に入れ、各関数の先頭に次の行を置きます。

if [ -n "$ZSH_VERSION" ]; then emulate -L ksh; fi

emulate shの代わりにemulate kshを使用して、.profileに必要なプレーンなsh構文に近づけることができます。

関数が別の関数を呼び出す場合、他の関数はエミュレート設定を継承するため、この行を内部関数に配置する必要はなく、エンドユーザーによって呼び出される関数にのみ配置します。

Shebangが_#!/bin/bash_で、スクリプトを_./script_として開始した場合、スクリプトはbashによって実行されます。ここではまったく問題ありません。

ただし、_zsh ./script_を実行するか、実行中のzshインスタンスに_. ./script_をソースする場合、bashとzshの構文が一致しないことがよくあります。

たとえば、zshはデフォルトでパラメーター展開を分割しません。bashには組み込みのヘルプがあり、zshには_read -p Prompt_がありません(構文は非常に異なります。読み取りcmd \?prompt , arrays start on 1 (not 0) in zsh, command only search for external commands in zsh, or there is no (simple) equivalent to $ {foo ^} `(最初の文字のみ大文字)は、zshなどの中でこれは(ほとんど) 類似点といくつかの違い の長いリストです。

場合によっては、zshは他のシェルをエミュレートするように指示されることがあります。場合によっては、両方のシェルに移植可能な共通の構文がない(別名または関数を使用して移植可能なソリューションをエミュレートしない場合)。

ただし、zshには多くの(多くの)拡張機能があり、対話形式での作業が容易になります。それは同時に、切り替える優れた理由と問題です。

  1. Pro zsh

    • タブを押してコマンド構文オプションを確認できるのはとても良いことです。
    • Zshのもう1つの大きな利点は、タイプミスをした場合のエラー修正です。エラーを表示するだけではなく、コマンドが見つかりませんでした。zshは、入力しようとした内容を解釈しようとします。 zshはこの入力を有効なコマンドとして受け入れます。
    • また、zshには、さまざまなソリューションを可能にする展開に対する多くの修飾子があります。 Like:ファイルのみのリスト:ls *(.)(他のシェルでは難しい)。 十分に深く見たときに、zsh(print -rl -- *(/) でも答えが複雑になります。
    • 浮動小数点を使用して数学を受け入れます(注意点があります)。
  2. Con zsh:

    • 多くのシステムでは、Bashがデフォルトのシェルです。
    • 多くのzshオプションは、bash互換スクリプトの作成に直接役立ちません。
    • 2つのシェルを同時に学習しようとすると、大きな問題になる可能性さえあります。

結局、それはあなたの選択です、そして、私はいつもより多くの選択肢が好きです。

6
Isaac