シバン行から呼び出され、条件に基づいて (私の場合は OS バージョンに基づいて) 適切なインタープリターを返すスクリプトを作成しようとしていますが、なぜ機能しないのか理解できません。
例を挙げて説明します:
実行可能ファイル 1: /home/orens/dynamically_select_interpreter/select_interpreter.sh:
#!/usr/bin/env bash
echoerr() { echo "$@" 1>&2; }
interpreter=`cat /home/orens/dynamically_select_interpreter/interpreter`
if [ -z "$interpreter" ]; then
echoerr "Could not find interpreter!"
exit 1
fi
echoerr "Found interpreter: $interpreter"
exec "$interpreter" "$@"
このスクリプトは、いくつかのファイルの内容 (この場合、内容は: ) に基づいてインタープリターを選択します/usr/bin/python
。次に、 を呼び出して、自分自身を適切なインタープリターに置き換えますexec
。
コマンドラインから呼び出すと、次のようになります。
$ /home/orens/dynamically_select_interpreter/select_interpreter.sh
Found interpreter: /usr/bin/python
Python 2.4.3 (#1, Dec 10 2010, 17:24:35)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-50)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
ただし、次のように、シバン行内で使用しようとすると:
#!/home/orens/dynamically_select_interpreter/select_interpreter.sh
echo $SHELL # should be an error # LINE 1
import sys; print "HERE"; print sys.version # this is the actual error # LINE 2
スクリプトは、python スクリプトではなくシェル スクリプトとして実行されます。LINE 1 は正しく実行されますが、LINE 2 ではエラーが発生します。シバン行が黙って無視されているようです (そして、stderr への出力でさえ画面に表示されません)。
基本的に、私は と同じことをしようとしていますenv
が、スクリプトからです。C/C++ で記述してコンパイルすると、必要なものが得られると思いますが、このスクリプトは、複数のカーネル バージョンの状況を克服するためのツールとして使用されるため、実行可能ファイルを OS にしたいと考えています。独立していて、これを達成する唯一の方法はスクリプトです。
誰かがこの動作を説明したり、解決するのを手伝ってくれたりできますか?
ありがとう!