回答:
スクリプトが行で始まる#!/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/bash
bashによって実行されます。
もし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:
最後に、それはあなたの選択であり、私は常により多くの選択肢が好きです。