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

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

bashからzshに切り替えたいのですが、bashスクリプトの互換性が心配です。

すべてのbashスクリプト/関数はzshと互換性がありますか?もしそうなら、これが本当なら、zshはbashの拡張機能でしょうか?

答え1

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

私はzshの構文がbashの構文と非常によく似ていることを知りましたが、実際にいくつかの非互換性があるかどうかはわかりませんでした。 6年前、私はbashからzshにスムーズに切り替えました。

答え2

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

インタラクティブに使用するシェルは、保持しているスクリプトとは何の関係もありません。スクリプトを実行するシェルは、最初の行に表示されるシェルです。シェルボーンワイヤー。たとえば、スクリプトがで始まると、#!/bin/bashbashによって実行されます。

bashをカスタマイズした場合は、名前.bashrc.zshrcPDKSH)。プロンプト設定、完成機能、ほとんどのオプションなど、他のものは完全に書き直す必要がありました。

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

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

emulate sh代わりにを使用すると、emulate ksh正確に必要なsh構文に近づくことができます.profile

ある関数が別の関数を呼び出すと、別の関数が最も設定を継承するため、この行を内部関数に入れる必要はなく、エンドユーザーが呼び出した関数にのみ入れることができます。

答え3

Shebangがあり、#!/bin/bashスクリプトを起動すると、./scriptスクリプトはbashによって実行されます。ここにはまったく問題はありません。

ただし、実行中のzshインスタンスで実行またはzsh ./scriptソーシングする場合は、. ./scriptbashとzshの構文が一致しないのが一般的です。

たとえば、zshパラメータ拡張はデフォルトでは分割されず、組み込みbashのヘルプがあり、zshには何もありませんread -p prompt(構文はreadとは大きく異なりcmd\?prompt、zshの配列は0ではなく1で始まり、commandzshでは外部コマンドのみが可能です。 )。検索または${foo^}zshにない(単純)(最初の文字のみを大文字として使用)と同じです。これは(ほとんど)長いリストです。類似点と相違点

場合によっては、zsh他のシェルをエミュレートするように求められます。場合によっては、両方のシェルに移植可能な共通構文はありません(移植可能なソリューションをシミュレートするためにエイリアスや関数は使用されません)。

しかし、zshインタラクティブなタスクをより簡単にする多くの拡張機能があります。これは切り替えるべき理由と問題です。

  1. zshのプロフェッショナルバージョン
  • タブ固有のコマンド構文オプションを確認すると良いでしょう。
  • zshのもう一つの主な利点は、入力エラーが発生したときにエラーを修正することです。 zshはエラー:コマンドが見つからないことを示すだけでなく、ユーザーが入力したいものを解釈しようとします。 zshはこの入力を有効なコマンドとして受け入れます。
  • それに加えて、より多くのzshがあります修飾子多数のソリューションを許可します。例: ファイルのリストのみをリストします: (ls *(.)他のシェルでは難しい)。十分に深く見てもprint -rl -- *(/)zsh() では答えが複雑になります。
  • 浮動小数点数を含む数学を許可します(一部の注意事項あり)。
  1. 詐欺師zsh:
  • Bashは多くのシステムのデフォルトシェルです。
  • 多くのzshオプションはbash互換のスクリプトを書くのに直接役立ちません。
  • 同時に、2つのシェルを学ぶことを試みることは大きな問題になるかもしれません。

最終的にそれはあなたの選択であり、私はいつもより多くのオプションが好きです。

答え4

BashとZshは、言語構文の点でユニークな特性を持つ2つの異なるソルバーです。

対話型デバッグにBash互換性が必要な場合は、いつでも両方を使用できます。 Bashのデフォルト値を設定し、exec zshZ Shellで実行してexec bashBashに戻ります。

Zshをデフォルトのシェルとして使用するには、逆にするだけです。

  • echo $SHELLデフォルトシェルと現在のインスタンスシェルがecho $0疑わしい場合は実行してください。
  • zshから呼び出すと、bash ./script望むかもしれないし望ましくないかもしれないスクリプトのbashサブシェルが作成されます。

関連情報