스크립트가 shebang을 통해 실행되고 있는지 또는 명령줄 인수로 지정되어 있는지 감지

스크립트가 shebang을 통해 실행되고 있는지 또는 명령줄 인수로 지정되어 있는지 감지

Pyenv 프로젝트에서 우리는 특별한 문제에 직면했습니다.

python( 및 ) python*를 런타임 시 실행할 Python 실행 파일을 선택하는 Bash 스크립트("shim")로 대체합니다.

지금,일부 사용자는 특별한 선택 논리를 사용하고 싶어합니다.path/to/script.py문제는 Python 스크립트가 . 로 실행될 때 , <python> path/to/script.py스크립트가 !로 실행되면 이 논리를 적용해서는 안 된다는 것입니다.

이 두 가지 경우를 확실하게 구별할 수 있는 방법이 있습니까?

아무것도 찾을 수 없습니다. 두 번째 경우에 명령줄 인수가 어떻게 공식화되었는지에 따라 두 경우 모두 정확히 동일한 명령줄이 실행될 수 있습니다. (
주어진 Bash 스크립트는 실제 shim이 아니며 데모 예제일 뿐입니다. 우리의 논리는 보고 행동합니다)

$ 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. 행운을 빌어요;-)

관련 정보