/proc에서 스크립트를 실행하기 위한 전체 경로를 가져옵니다.

/proc에서 스크립트를 실행하기 위한 전체 경로를 가져옵니다.

실행 중인 스크립트가 스크립트 경로를 인수로 사용하여 인터프리터를 호출하는 대신 직접 호출되는 경우 인터프리터에 관계없이 스크립트 파일의 전체 경로를 어떻게 안정적으로 검색할 수 있습니까?

다음은 몇 가지 방법입니다.아니요스크립트의 절대 경로를 검색합니다.

  • 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스크립트 내에서 검색하는 것은 쓸모가 없습니다. 그러나 우리의 쉘 래퍼는 단순히 스크립트 이름을 첫 번째 인수로 전달합니다. 대본은 이것을 예상했고 모든 것이 좋았습니다.

관련 정보