web-dev-qa-db-ja.com

#!/ usr / bin / envインタープリター引数-インタープリター用の引数を持つポータブルスクリプト

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だけでなく、すべてのインタープリターで機能する一般的な回避策を示してください。

7
huyz

これは、ZSHの移植性の問題を回避するためのインラインソリューションです。

#! /bin/sh

if [ -z "$IN_ZSH" ]; then
  export IN_ZSH=1
  exec zsh -f "$0" "$@"
fi

## Your ZSH script here

試す他のいくつかの方法が含まれます

  • / usr/bin/envを介してenv変数を渡すと、--optionsと同じ動作が変更されます。
#!/usr/bin/env POSIXLY_CORRECT = 1 bash 
  • このスクリプトがSHを使用して開始するが、同じスクリプトでTCLを呼び出す方法など、巧妙なコメントのトリックを使用する
#! /bin/sh
#\
TCLBIN =/usr/bin/tclsh;\
 exec $ TCLBIN "$ 0" "$ @" 
#残りはtclsh 
 set argc 
を介して実行します。
  • 渡される--optionsロード動作に影響しない場合、インタープリターでオプションを1回設定します。
#!/usr/bin/env bash 
#エラーが検出されたら終了します
 set -e 
  • Perlの場合、新しいバージョンを使用できる場合は、-wの代わりにこれが機能する可能性があります。
#!/usr/bin/env Perl 
警告を使用; 
  • / usr/bin/envの代わりにbootstrap 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 
6
Bryan Drewery