Zsh、bash、python、Perlなどのインタープリターはファイルシステムのさまざまな場所に配置される可能性があるため、スクリプトには、移植性のためにenv
を使用するShebangが含まれていることがよくあります。 #!/usr/bin/env zsh
。ただし、 http://en.wikipedia.org/wiki/Shebang_(Unix)#Portability で説明されているように、Linuxを含む多くのシステムでは、インタープリターに引数を渡すことは許可されていません。
多くの場合、スクリプトが#!/usr/bin/env zsh -f
を読み取れないように、~/.zshenv
のようなことをしたい、または#!/usr/bin/env Perl -w
などを実行したい。これはOSXで機能します。しかし、Linuxではそうではありません。
そのための回避策は何ですか?移植性と通訳者のための議論という両方の長所を利用できますか?可能であれば、zshだけでなく、すべてのインタープリターで機能する一般的な回避策を示してください。
これは、ZSHの移植性の問題を回避するためのインラインソリューションです。
#! /bin/sh
if [ -z "$IN_ZSH" ]; then
export IN_ZSH=1
exec zsh -f "$0" "$@"
fi
## Your ZSH script here
試す他のいくつかの方法が含まれます
--options
と同じ動作が変更されます。#!/usr/bin/env POSIXLY_CORRECT = 1 bash
#! /bin/sh #\ TCLBIN =/usr/bin/tclsh;\ exec $ TCLBIN "$ 0" "$ @" #残りはtclsh set argc を介して実行します。
--options
がロード動作に影響しない場合、インタープリターでオプションを1回設定します。#!/usr/bin/env bash #エラーが検出されたら終了します set -e
#!/usr/bin/env Perl 警告を使用;
invoke.sh
スクリプトを使用してPATHを使用し、/path/to/invoke.sh script
で始まるスクリプトで#! zsh -f
を呼び出します。#! /bin/sh SCRIPT= $ 1 shift 1 cmd = `sed -n -e's:#! \?:: '-e' 1p '$ SCRIPT` exec $ cmd $ SCRIPT