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
基本的な質問ならすみません。zsh
shebangposix
とshebangを検索しましたが、似たような質問が見つかりませんでした。
答え1
Shebangはスクリプトを直接実行する場合にのみ効果があります。実行方法を指定しない;つまり、./scratch.sh
または同じものを使用して/path/to/scratch.sh
ディレクトリに配置し、をPATH
使用しますscratch.sh
。
別のコマンドで実行すると、実行が制御されます(shebangオーバーライド)。を使用するとbash scratch.sh
で実行され、 を使用するとシステムで実行できます (特定の場合)。bash
zsh scratch.sh
zsh
sh
sh
dash
使用またはsource scratch.sh
実行されて. scratch.sh
いる場合現在のシェル、それは何でも。これが.
andコマンドの完全な目的ですsource
。ここでも shebang は無視されます。
答え2
あなたはそうすることはできません。. script
または、これを実行するために別々の標準または非標準シェルをフォークしないことをsource script
含めることができます。script
shebangsについては、なぜならzsh
(あなたが源泉代わりにスクリプト実装するそれ)彼らは単にコメントするだけです。
ただし、zsh
一時的に標準シェルをエミュレートするように指示(試行)できます。 YMMV。
emulate sh -c '. ./scratch.sh'
emulate which_sh -c str
str
一時的に有効な指定されたシミュレーションを使用して評価され、より重要なことには、評価中に定義されたすべての機能に「固定」され、実行str
中にシミュレーションモードが自動的にオンになります。