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