실행 중인 스크립트가 스크립트 경로를 인수로 사용하여 인터프리터를 호출하는 대신 직접 호출되는 경우 인터프리터에 관계없이 스크립트 파일의 전체 경로를 어떻게 안정적으로 검색할 수 있습니까?
다음은 몇 가지 방법입니다.아니요스크립트의 절대 경로를 검색합니다.
readlink /proc/$PID/exe
복귀 경로통역사PID ${PID}가 스크립트인 경우.cat /proc/$PID/comm
반품기본 이름스크립팅됨.- 내용에 대해서는 믿을만한 것이 없습니다
/proc/$PID/cmdline
. 이는 실행 중인 프로그램에 의해 변경될 수 있으며 "0번째" 매개변수는 (echo $0
터미널 세션에서 실행될 때 와 같이) 스크립트의 실제 경로가 될 것이라고 보장되지 않습니다 .
답변1
스크립트는 단지 인터프리터가 읽는 데이터 조각이기 때문에 운영 체제는 이에 대해 아무것도 할 수 없습니다. 인터프리터는 스크립트 본문을 사용한 다음 파일을 닫을 수 있고 스크립트 위치를 추적하지 않는 방식으로 전역 인수 벡터를 조작할 수도 있습니다.
스크립트 이름 및 기타 기능에 대한 액세스는 스크립트가 인터프리터에서 자체 명령줄 옵션으로 처리되지 않는 자체 명령줄 옵션을 갖는 기능과 같이 스크립트 언어를 통해 제공됩니다.
스크립트 언어에 없으면 그것을 사용할 수 있습니다 /proc
. 인터프리터가 실행될 때 스크립트 파일을 열고 그것이 항상 특정 파일 설명자 번호라는 것을 알고 있다면 그것을 볼 수 있습니다. /proc/self/fd
예를 들어, 이것은 특정 GNU/Linux 시스템에서 효과적이었습니다.
$ ./shellarg a b c
my name is /home/kaz/junk/shellarg
어디 shellarg
:
#!/bin/sh
mypath=$(readlink /proc/$$/fd/10)
echo "my name is $mypath"
파일 설명자 10으로 열리는 스크립트에 따라 달라지므로 이 방법을 권장하지 않습니다. 게다가 이 특정 스크립팅 언어의 경우 쉘이 잘 작동하고 스크립트 이름을 $0
.
스크립트 이름을 얻기 어렵게 만드는 일부 적대적인 스크립트 언어를 사용하는 경우 다음을 삽입하여 쉘 래퍼를 통해 스크립트를 호출할 수 있습니다 $0
.
#!/bin/sh
mydir=$(dirname "$0")
fbzfile="$mydir"/script.fbz
frobozz-interpreter -f $fbzfile -- $fbzfile ... other args
여기서 frobozz-interpreter
스크립트 이름은 매개변수로 수신되며 -f
비밀로 유지됩니다. 전체 파일을 구문 분석한 다음 스크립트를 실행하기 전에 닫으므로 /proc
스크립트 내에서 검색하는 것은 쓸모가 없습니다. 그러나 우리의 쉘 래퍼는 단순히 스크립트 이름을 첫 번째 인수로 전달합니다. 대본은 이것을 예상했고 모든 것이 좋았습니다.