回答:
スクリプトが行で始まる#!/bin/bash場合、デフォルトのシェルがzshであっても、bashを使用して実行されます。
zshの構文はbashの構文に非常に近いことがわかりましたが、実際に非互換性がある場合は注意を払いませんでした。6年前にbashからzshにシームレスに切り替えました。
.zshrc:)
#!/bin/bashようなスクリプトファイルを実行している場合、行が無視される場合はsource ./script.sh?
#!/usr/bin/env bash代わりに、特に macOSでは、デフォルトのbashが非常に古く、新しいバージョンが事実上常に異なるパスにインストールされる場合に使用する必要があります。
Zshを正しいエミュレーションモード(emulate shまたはemulate ksh)にすると、ほとんどのBourne、POSIX、またはksh88スクリプトを実行できます。bashまたはksh93のすべての機能をサポートしているわけではありません。Zshにはbashのほとんどの機能がありますが、多くの場合、構文は異なります。
対話的に使用するシェルは、使用しているスクリプトとは無関係です。スクリプトを実行するシェルは、最初の行であるシェバン行に示されているものです。たとえば、スクリプトがで始まる場合、#!/bin/bashbashによって実行されます。
もしbashをカスタマイズした場合、あなたは自分の名前を変更することはできません.bashrcにします.zshrc。2つのシェル間の交差点に固執する限り(エイリアスと関数など)、いくつかのものを共有できます(交差点はksh88とpdkshに近い)。プロンプト設定、補完機能、ほとんどのオプションなど、その他のものは完全に書き直す必要があります。
あなたはスニペットを書いている場合は、人々が自分からソースにするために.bashrcか.zshrc、あなたは、2つのバージョンを維持するのbashのプログラミング機能のほとんどを含んではbashとzshの機能のサブセット、に固執する必要はありません。コード全体を関数に配置し、各関数の先頭に次の行を配置します。
if [ -n "$ZSH_VERSION" ]; then emulate -L ksh; fi
emulate sh代わりにemulate kshを使用して、単純なsh構文に近づけることができます。これは、必要なものです.profile。
関数が別の関数を呼び出す場合、他の関数はエミュレート設定を継承します。したがって、この行を内部関数に配置する必要はなく、エンドユーザーによって呼び出された関数のみに配置する必要があります。
./my_script.sh。source my_script.shそして. my_script.sh、それはどんなシェバングを無視して、現在のシェルのようになり実行されます。
シバンが#!/bin/bashあり./script、スクリプトがbashによって実行されるときにスクリプトを開始する場合。ここではまったく問題ありません。
ただし、実行中のzshインスタンスに実行zsh ./scriptまたはソースする. ./script場合、bashとzshの構文が一致しないことはよくあります。
たとえば、zshはデフォルトではパラメーター展開を分割しません。bashにはヘルプが組み込まれています。zshにはありませんread -p prompt(構文はzshでcmd \?prompt , arrays start on 1 (not 0) in zsh,コマンドonly search for external commands in zsh, or there is no (simple) equivalent to$ {foo ^} `(大文字のみ)これは、(ほとんど)類似点といくつかの相違点の長いリストです。
場合によっては、zshが他のシェルをエミュレートするように指示される場合があります。場合によっては、両方のシェルに移植可能な共通の構文がありません(エイリアスまたは関数を使用して移植可能なソリューションをエミュレートしません)。
ただし、zshには、インタラクティブな作業を容易にする多くの(多くの)拡張機能があります。それは同時に、切り替えるべき優れた理由であり、問題でもあります。
ls *(.)他のシェルでは難しい)。十分に深く見たときでも、答えはzsh(print -rl -- *(/))で複雑になります。Con zsh:
最後に、それはあなたの選択であり、私は常により多くの選択肢が好きです。