Perl로 Python 스크립트를 실행할 때 구문 오류가 발생하지 않는 이유는 무엇입니까?


85

방금 테스트 용 Python 코드를에 썼고 test.py다음과 같이 시작합니다.

perl test.py

잠시 후 나는 나의 실수를 깨달았다. 파이썬 코드는 마치 파이썬 인터프리터처럼 실제로 올바르게 실행되기 때문에 "잠시 후"라고 말합니다!

Perl이 Python을 해석하는 이유는 무엇입니까? test.py다음과 같이 보입니다.

#!/usr/bin/python

...Python code here...

흥미롭게도 반대로하면 (즉, call python something.pl) 많은 구문 오류가 발생합니다.


6
나는 그것이 #!파일의 시작 부분에 있기 때문이라고 생각 합니다. 실제로 그녀를 제거하면 예상되는 동작이 나타납니다. 어쨌든 보안 측면에서 나쁜 생각이 아닙니까?
Dacav

7
아니요. 통역사를 지정하는 것이 shebang 경로의 지점입니다. 실행할 코드를 신뢰할 수 없다면 처음부터 실행해서는 안됩니다.
Sobrique 2015

1
아니 정말. 스크립트는 텍스트 파일입니다. 그 이상도 이하도 아닌. 통역사 없이는 '실행'되지 않습니다.
Sobrique 2015

4
"내 Perl이 내 Python을 해석하는 이유는 무엇입니까?" "더 이상 재현 할 수없는 문제 나 단순한 인쇄상의 오류"가 아닙니다. 재 개설에 투표했습니다. Q와 A 쇼에 대한 찬성 투표는 대중적인 관심의 문제입니다.
ikegami

1
@ikegami 인기에 관계없이 "간단한 인쇄상의 오류 ... 미래의 독자에게 도움이되지 않는 방식으로 해결"된 것은 아닙니다. 재 개설에 투표했습니다.
ThisSuitIsBlackNot apr

답변:


114

에서 perlrun ,

는 IF #!라인은 단어 "펄"나 단어가 이름을 딴 "든지 indir"프로그램 포함하지 않는 #!대신에 펄 인터프리터의 실행을. 이것은 약간 기이하지만,하지 않는 기계를 사용하는 사람들에게 도움이됩니다 #!. 왜냐하면 그들은 그들의 SHELL이 / usr / bin / perl 이라고 프로그램에 알릴 수 있기 때문입니다 . 그리고 Perl은 올바른 인터프리터에게 프로그램을 보낼 것입니다.

예를 들면

$ cat a
#!/bin/cat
meow

$ perl a
#!/bin/cat
meow

32
와. 모호한 기능에 대해 이야기하십시오. 저는 Perl을 20 년 넘게 사용해 왔지만 그렇게하는 줄은 몰랐습니다.
cjm apr

4
DOS, VMS 및 Solaris에서 Perl v4를 사용하기 시작했습니다. 이와 같은 OS에 구애받지 않는 / 브리징 기능으로 인해 크로스 플랫폼 수명이 훨씬 쉬워졌습니다.
tjd

1
@MarcvanLeeuwen Linux, OSX, VAX / VMS, Windows, Solaris, OS / 2 및 기타 스크립트 언어 프로그램 포팅의 가장 성가신 부분은 일반적으로 이러한 시스템과 마찬가지로 시작하는 것입니다. "명령을 입력하고 찾아서 실행"기능을 공통적으로 공유하고 거의 모든 것을 다르게 수행합니다. 이 Perl 기능은 Perl을 기능면에서 쉽게 갭 브리지로 만듭니다 . Unix 스타일의 shebang 작성할 수 있으며 Perl이 존재하면 Perl 코드 여부에 관계없이 코드는 항상 작동 #! /usr/bin/env foo합니다.
zxq9

1
@immibis perl5- porters 메일 링리스트에있는 Shebang 라인에서 미스터리파싱 하는 스레드에서 : " indir는 다른 프로그램을 간접적으로 실행하도록 설계된 프로그램입니다. 제 기억은 OS가 기본적으로 제공하지 않는 setuid 상황에서 특히 유용해야한다는 것입니다. 많은 도움이되며 OS 커널이 32 자 명령 줄로 제한되는 상황에서 도움이 될 수 있습니다. "
ThisSuitIsBlackNot

2
이것은 프로그래밍 언어의 부엌 싱크대로서 Perl의 명성을 확고히합니다. 흥미로운 관찰로, shebang의 원래 구현은 쉘 기능이라고 생각하며 나중에 유닉스 커널로 옮겨졌습니다. Perl에는 많은 셸 메커니즘 (예 : 명령 출력을 대체하기위한 백틱)이 포함되어 있습니다.
Barmar 2015-04-15
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.