テキストファイルに書かれたスクリプトを処理するPythonで書かれた簡単なスクリプトインタープリターがあります。スクリプトの上部にあるシバンを使用してインタープリターを参照できるため、スクリプトを直接実行できます。
インタープリターには、引数リストを調整して補正できるように、シェバンを介して呼び出されたことを検出するロジックがあります。これが必要なのは、直接呼び出された場合、各引数はargvの個別の項目ですが、シバンを介して呼び出された場合、シバン行のすべての引数は最初の引数文字列に含まれ、スクリプトの名前は2番目の引数文字列に含まれるためです。その後に続くスクリプトに直接与えられた引数を使用します。
シェバンをチェックする方法は次のとおりです。
def main(name, argv):
...
if len(argv) >= 2 and name[0] == '/' and os.path.isfile(argv[1]) and os.access(argv[1], os.X_OK):
input = open(argv[1])
arglist = argv[0].split() + argv[2:]
else:
arglist = argv
input = sys.stdin
...
sys.exit(main(sys.argv[0], sys.argv[1:]))
これは、少なくとも2つのargv値があり、コマンド名が「/」で始まり(shebang実行可能パスは絶対)、argv [1]のスクリプト名が実行可能ファイルである場合に、実行がshebang経由で行われたと想定します。実行がシバンを介して行われる場合、引数リストはargv [0]に分割され、さらにargv[2]以降がそのリストに追加されます。
これが正しいかどうか、またはこれをより明確に判断する別の方法があるかどうかを知りたいです。私が行ったことは、使用する必要のあるすべてのシナリオで正常に機能しますが、より良い方法がある場合はそれを知りたいと思います。