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 は無視されます。