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


回答:


55

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

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


1
切り替えの中で最も難しかったことは何ですか?
chrisjlee

4
無し。私の個人的なスクリプトはbashへの適切な参照を追加し、最初から良い.zshrcを見つけました。Zshとbashは十分に似ていたので、私はそれを本当に難しいとは思いませんでした。
ホイヘンス

4
あなたのリストできます.zshrc:)
neaumusic

しかし、次の#!/bin/bashようなスクリプトファイルを実行している場合、行が無視される場合はsource ./script.sh
LCB

3
シェルへのパスをハードコーディングすることは、たとえ頻繁に行われたとしても、悪いアドバイスです。#!/usr/bin/env bash代わりに、特に macOSでは、デフォルトのbashが非常に古く、新しいバージョンが事実上常に異なるパスにインストールされる場合に使用する必要があります。
コンラッドルドルフ

29

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

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


1
スクリプトをとして実行する場合、使用するシェルは無関係です./my_script.shsource my_script.shそして. my_script.sh、それはどんなシェバングを無視して、現在のシェルのようになり実行されます。
BallpointBen

3

シバンが#!/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には、インタラクティブな作業を容易にする多くの(多くの)拡張機能があります。それは同時に、切り替えるべき優れた理由であり、問​​題でもあります。

  1. プロzsh

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

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

最後に、それはあなたの選択であり、私は常により多くの選択肢が好きです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.