zshはshebang bin / shを尊重するので、ダッシュを使用できますか?

zshはshebang bin / shを尊重するので、ダッシュを使用できますか?

Bashのループに関連する単純なスクリプトがあり、forそれをzshで使用しようとしています。私はshebangがPOSIX互換シェルが(私のシステムで)使用されることを保証するので、/bin/sh -> dash*問題はないと仮定しました。

MWEスクリプトは、ITEMS実際にパッケージを一覧表示するコマンドの出力ですITEMS=$(pip freeze)。たとえば、次のようになります。

#!/bin/sh

# ITEMS=$(pip freeze)  # Example of useful command

ITEMS="Item1
Item2
Item3"  # Dummy variable for testing

for ITEM in $ITEMS; do
    echo $ITEM
    echo Complete
done

次のスクリプトを実行しようとしたときの出力は次のとおりですzsh

$ source scratch.sh
Item1
Item2
Item3
Complete  # Undesired

$ . ./scratch.sh
Item1
Item2
Item3
Complete  # Undesired

$ bash scratch.sh
Item1
Complete
Item2
Complete
Item3
Complete  # Desired

$ sh scratch.sh
Item1
Complete
Item2
Complete
Item3
Complete  # Desired

bash端末で実行すると正常に動作します。 Shebangがどのように解釈されるのか誤解したようですzsh。誰かが私が実行したときとsource scratch.sh同じ. ./scratch.sh出力を持つようにこれをどのように使用するかを説明できますかsh scratch.sh? forループスクリプトを変更してデフォルトで互換性がzshあることを知っていますが、常にposix互換シェルを使用し、bashismsやzshismsを心配する必要がないようにbash使用したいと思います。/bin/sh -> dash

基本的な質問ならすみません。zshshebangposixとshebangを検索しましたが、似たような質問が見つかりませんでした。

答え1

Shebangはスクリプトを直接実行する場合にのみ効果があります。実行方法を指定しない;つまり、./scratch.shまたは同じものを使用して/path/to/scratch.shディレクトリに配置し、をPATH使用しますscratch.sh

別のコマンドで実行すると、実行が制御されます(shebangオーバーライド)。を使用するとbash scratch.shで実行され、 を使用するとシステムで実行できます (特定の場合)。bashzsh scratch.shzshshshdash

使用またはsource scratch.sh実行されて. scratch.shいる場合現在のシェル、それは何でも。これが.andコマンドの完全な目的ですsource。ここでも shebang は無視されます。

答え2

あなたはそうすることはできません。. scriptまたは、これを実行するために別々の標準または非標準シェルをフォークしないことをsource script含めることができます。scriptshebangsについては、なぜならzsh(あなたが源泉代わりにスクリプト実装するそれ)彼らは単にコメントするだけです。

ただし、zsh一時的に標準シェルをエミュレートするように指示(試行)できます。 YMMV。

emulate sh -c '. ./scratch.sh'

emulate which_sh -c strstr一時的に有効な指定されたシミュレーションを使用して評価され、より重要なことには、評価中に定義されたすべての機能に「固定」され、実行str中にシミュレーションモードが自動的にオンになります。

関連情報