2010-07-06 4 views
3

C/C++ (bash, 역시?)의 첫 번째 명령 줄 인수 argv [0]은 이진 파일 이름 (사용자가 호출 한 절대 경로 또는 상대 경로).실행중인 Perl 스크립트의 경로 및 이름을 얻는 방법

Perl에서 첫 번째 명령 줄 인수 $ ARGV [0]은 스크립트의 경로와 이름 뒤에 오는 첫 번째 명령 줄 인수입니다.

어떻게 Perl 스크립트가 그것을 호출하는 데 사용 된 경로와 이름을 얻을 수 있습니까?

감사합니다.

답변

6

이 방법에 의해, 데드 잘못된 "C/C++ (도 떠들썩한 파티?) 제 커맨드 라인 인수는 argv에는 [0], 이진 파일 이름이다." ISO 표준은 그런 것을 요구하지 않습니다.

C99에서

:

는 argc의 값이 0보다 크면, 문자열 argv를 가리키는 [0] 프로그램 이름을 나타내고; 호스트 환경에서 프로그램 이름을 사용할 수 없으면 argv [0] [0]은 널 문자입니다.

"이진 실행 파일의 위치"가 아니라 "프로그램 이름을 나타냅니다"라는 것을 알 수 있습니다. 상태 이전 조각 거기 때문 :

... 어레이 구성원 argv를 [0]는 argv 내지 [ARGC-1] 호스트 환경 구현 정의 값을 주어진 문자열에 대한 포인터를 포함한다 포함 시작 프로그램하기 전에. "

이 명령에 대한 argv[0]에 매우 합법적이다"./빈/수면 ""보다는 "인원의 환상적인 수면 유틸리티를"로 "수면 (60) 한마디로

의 환경은 프로그램의 표현을 제공 할 필요가 없으며, 그렇다고해도 t 바이너리의 위치를 ​​찾는데 사용할 수있는 것이면된다.


하지만, 내 통렬한 비난의 연설 당신을 지루 데 펄은이 목적을 위해 $0 또는 $PROGRAM_NAME (그 무시 무시한 "영어"모드에서)를 제공합니다. 자세한 내용은 perlvar을 참조하십시오.

+0

좋습니다. 나는 완벽한 이식성을 찾고 있지 않다고 생각한다. BTW, POSIX는 argv [0]에 포함 된 것에 대해 아무 말도하지 않습니까? –

+0

이 argv 동작을 C 또는 상위 수준 언어와 연결하면 안됩니다. 다음은 POSIX.1이 말하는 것입니다 : http://www.opengroup.org/onlinepubs/009695399/functions/exec.html 인수 argv는 null로 끝나는 문자열에 대한 문자 포인터의 배열입니다. 응용 프로그램은이 배열의 마지막 구성원이 null 포인터인지 확인해야합니다. 이 문자열은 새 프로세스 이미지에서 사용할 수있는 인수 목록을 구성합니다. argv [0]의 값은 exec 함수 중 하나에 의해 시작되는 프로세스와 연관된 파일 이름을 가리켜 야합니다. –

+0

probs가 없습니다, 포스코, 나는 그걸 가져다 줄 것이라고 생각했습니다. 누군가 C 표준에 대해 이야기 할 때, 그것은 항상 ISO-POSIX가 다음 단계라고 말합니다.어쨌든 표준 문서 (및 요구 사항 문서)를 합친 "언어 변호사"에게 익숙해지면 "해야"하고 "있어야"한다는 것이 매우 구체적인 의미를 가지고 있다는 것을 깨닫습니다. "숄 (Shall)"은 그 사건을 의미하지만 "해야"한다는 것은 그 사건이 사실 일 수 있음을 나타낼 뿐이지 만 반드시 그런 것은 아님을 의미합니다. POSIX가 따르는 ISO/IEC 지시문의 부록 H를 참조하십시오 : http://www.iec.ch/tiss/iec/Directives-Part2-Ed5.pdf – paxdiablo

7

$0에는 실행중인 perl 스크립트가 들어있는 파일의 이름이 들어 있습니다.

관련 문제