スクリプトがshebangを介して実行されているか、コマンドライン引数として指定されているかを検出する

スクリプトがshebangを介して実行されているか、コマンドライン引数として指定されているかを検出する

Pyenvプロジェクトでは、私たちは特別な問題に直面しました。

python(および)python*を実行時に実行するPython実行可能ファイルを選択するBashスクリプト(「shim」)に置き換えます。

今、一部のユーザーは特別な選択ロジックを使用したいと考えています。path/to/script.py問題は、Pythonスクリプトが 。で実行されるとき、<python> path/to/script.pyスクリプトが! で実行されると、このロジックを適用してはならないということです。

これら2つのケースを確実に区別する方法はありますか?

何も見つかりません。 2番目のケースでコマンドライン引数がどのように定式化されたかに応じて、どちらの場合もまったく同じコマンドラインを実行できます。 (
与えられたBashスクリプトは実際のシムではなく、デモの例にすぎません。私たちのロジックは見て行動します)

$ cat python3 
#!/bin/bash
echo "'$0'"
for a in "$@"; do
  echo "'$a'"
done
# need to do the detection here
exec python3 "$@"

$ cat t.py 
#!/home/vmuser/python3
import sys
print(sys.argv)

$ $PWD/t.py
'/home/vmuser/python3' 
'/home/vmuser/t.py'
['/home/vmuser/t.py']

$ $PWD/python3 $PWD/t.py 
'/home/vmuser/python3'
'/home/vmuser/t.py'
['/home/vmuser/t.py']

shebangはLinuxカーネル機能なので、メカニズムが使用されたことを示すいくつかのインジケータを設定できますか?


私達は考慮したユーザーはPythonスクリプトで特別なshebangを使用する必要があります。特別なロジックを適用したいのですがそのアイデアは人気がなかったなぜなら、これらのスクリプトを移植できないようにするからです。

ベストアンサー1

shebangはLinuxカーネル機能なので、メカニズムが使用されたことを示すいくつかのインジケータを設定できますか?

はい、そうです。 Linux は、AT_EXECFN補助ベクトル項目を元の実行可能ファイルのパスに設定します。 Cでは、などを使用してchar *at_execfn = (char*)getauxval(AT_EXECFN)これを行うことができます。stat(at_execfn)

しかし、bashからインポートするのは難しいです。パッケージを開いて/proc/self/auxv確認してください/proc/self/mem。幸運を祈ります;-)

おすすめ記事