sh 또는 perl을 통해 perl 스크립트를 호출하는 것의 차이점은 무엇입니까

sh 또는 perl을 통해 perl 스크립트를 호출하는 것의 차이점은 무엇입니까

간단한 Hello World Perl 스크립트가 있습니다.

#!/usr/bin/perl

print 'Hello world.';

를 통해 실행하면 제대로 작동 perl <file_name>하지만 를 통해 실행하면 실패합니다 sh <file_name>.

첫 번째 줄에 대한 나의 이해는 Perl 쉘을 호출한다는 것입니다(#!/usr/bin/bash가 bash 쉘을 호출하는 방법과 유사함). 그렇다면 이 두 명령의 차이점은 무엇입니까?

이 스레드를 찾았습니다.http://ubuntuforums.org/showthread.php?t=1133334"이 경우에는 Perl을 전혀 실행하지 않고 'print' 프로그램을 호출하는 쉘을 실행하고 있는 것 sh <file_name> 입니다." 그렇다면 #! 그렇다면 여전히 필요합니까?

(파일을 chmod +x하고 직접 실행할 수 있다는 것을 알고 있지만 내가 사용한 두 가지 방법의 차이점을 알고 싶습니다.)

답변1

파일을 직접 실행하면

/path/to/script/filename

shebang 라인을 실행하기 위해 통역사를 검색합니다. 인수를 사용하여 perl또는 를 실행하면 sh문서화된 대로 실행됩니다. 즉, 파일을 각각 Perl 또는 셸의 스크립트로 해석하려고 시도합니다.

명령줄(예 sh foo.pl: 또는 perl foo.pl)에서 명시적으로 인터프리터를 설정하면 실행할 인터프리터를 결정하는 데 shebang 줄이 사용되지 않습니다. 그것가능한 옵션은 구문 분석되지만(예: shebang을 사용하여 #!/usr/bin/perl -w스크립트를 실행하면 플래그가 perl foo.pl활성화됨 -w) 스크립트를 해석해야 하는 프로그램을 결정하는 데 사용되지 않습니다.

따라서 Perl 스크립트를 실행한다는 것은 Perl Shebang 라인에도 불구하고 시스템이 이를 스크립트 sh foo.pl로 해석하려고 시도한다는 것을 의미합니다.sh

답변2

그럼 스크립트를 실행 가능하게 만들지 않았나요? sh는 이러한 파일 확장자를 가진 항목이 실행 가능하다고 자동으로 가정하지 않으므로 이를 실행하거나 perl <file name>실행 가능하게 만들어야 합니다.chmod +x

답변3

이 두 가지는 사용 중인 시스템에 Perl이 설치된 방법에 따라 다를 수 있습니다. 다음 명령을 입력해 보세요.

which perl

실행 파일 에 "perl"이라는 경로가 표시됩니다 $PATH(입력하여 echo $PATH실행 파일을 확인하세요 ). $PATH많은 시스템에서 Perl이 일반적으로 설치되는 위치입니다 /usr/bin/perl. 이것이 바로 대부분의 Perl 스크립트 시작 부분에 있는 "shebang" 줄도 여기에 있다고 가정하는 이유입니다.

그러나 일부 시스템에서는 경로가 perl다를 수 있습니다. 이 경우 perl your_script.pl쉘을 사용하여 shebang 줄을 해석하는 것과 다른 결과를 얻을 수 있습니다. 예를 들어 ./your_script.pl전자의 경우 perl통역사가 $PATH스크립트를 해석하고 후자의 경우 통역사가 원하는 대로 해석합니다 /usr/bin/perl. 이는 동일하지 않을 수도 있습니다.

대부분의 경우 perlPerl을 직접 설치하면 시스템과 함께 제공된 것보다 최신 버전일 수 있습니다(참고자료 참조 /usr/bin). 즉, 시스템에는 둘 이상의 Perl 인터프리터가 있습니다. 이 경우, 원하는 것이 무엇인지 파악하고 해당 경로를 shebang 줄에 하드코딩하여 스크립트가 실수로 잘못된 버전의 Perl에 의해 해석되는 일이 없도록 하는 것이 좋습니다. ( use 5.12;이와 관련하여 보안을 강화하기 위해 스크립트에 유사한 내용을 작성할 수도 있습니다 .) Perl 해석기의 버전을 확인하려면 를 입력하십시오 /path/to/perl -v.

관련 정보