2012-04-17 1 views
11

둘 다 본 적이 :Perl : Shebang (스페이스?) "#!"?

#!/path/... 
#! /path/... 

바로 무엇입니까? 그게 그렇게 중요한 건가? 역사가 있습니까?

고대 버전의 유닉스에는 공간이 필요 없다고 들었습니다. 그러나 그때 나는 그것이 단지 소문이라고 들었다. 누구든지 확실하게 알고 있습니까?


편집 : 내가이 물어 위치를 잘 생각하지 못했습니다. 내가 알고있는 모든 것을 위해 공간이 프로그램을 다른 방식으로 작동시킬 수 있기 때문에 관련 프로그래밍입니다. 그래서 나는 여기에서 그것을 물었다.

+0

둘 다 모두 일을 본 적이 있다면, 그것은 취향의 문제 있다는 추론하기 위하여 서 것입니다/미적. –

+2

나는 이것이 프로그래밍과 어떤 관계가 있는지 모르겠습니다. – ergosys

+0

@ JustinPearce : 그건 안전한 가정이 아닙니다. 어떤 시스템은 '#!'다음에 공백을 허용하지 않으므로 공 간이없는 버전을 더 이식성있게 만들 수 있습니다. 그러나, 모든 시스템이 공란을 허용 할 가능성이 높습니다. 자세한 내용은 내 대답을 참조하십시오. –

답변

17

일부 유닉스 계열 시스템에서는 공백이 허용되지 않았지만 약간의 연구가이를 지원하지 않는다는 막연한 기억이 있습니다.

this Wikipedia article에 따르면, #! 구문 월에 버전 8 유닉스에 도입 된이 기능의 1980 년 데니스 리치의 초기 발표는 말한다 : 그 파일이 실행되는 경우가 시작되도록

시스템이 변경되었습니다 의 마술 문자 #! , 행의 나머지 부분은 실행 파일의 해석기 이름이 인 것으로 이해됩니다. 이전에는 (실제로는 ) 셸이이 작업을 많이 수행했습니다. 문자 파일의 이름을 명령으로 입력하면 자동으로 이 실행 가능 모드로 텍스트 파일에서 실행됩니다. 시설을 시스템에 넣으면 다음과 같은 이점이 있습니다.

이 멋진 기회를 활용하기 위해

[SNIP는, 쉘 스크립트의 첫 번째 줄의 왼쪽 여백에

#! /bin/sh 

을 넣어. 공백 후 ! 괜찮습니다. 전체 경로 이름을 사용하십시오 (검색이 수행되지 않음). 순간에 전체 줄은 16 자로 제한되지만이 한도 인 이 발생합니다.

그것은 나중에, 유닉스 계열 시스템이 #! 구문을 지원하지만 웁니다 ! 후 허용하지 못했지만, 최초의 구현이 명시 적으로 가능성이 보인다, 공백을 허용 주어진 것을 생각할 수있다.

leonbloy의 대답은 좀 더 자세한 내용을 제공합니다.

UPDATE :

자체가 심지어는 커널에 의해 인식되지 않는 것 시스템, #!로 시작하는 라인을 인식 펄 인터프리터. 자세한 내용은 perldoc perlrun을 실행하거나 this web page을 참조하십시오.

#! 라인은 항상 회선이 인 것처럼 스위치에 대해 검사됩니다. 따라서 #f와 함께 하나의 인수 인 만 허용하는 시스템에 있다면! 라인 또는 악화, 심지어 #을 인식하지 않습니다! 행을 사용하면 은 Perl이 이 호출 된 방식과 상관없이 일관된 스위치 동작을 얻을 수 있습니다. 심지어 -x가 프로그램의 시작 부분을 찾는 데 사용 되더라도 마찬가지입니다.

Perl은 #! 다음의 공백도 허용합니다.

(개인적으로, 나는 공백없이 #! 라인을 작성하는 것을 선호하지만 어느 쪽이든 작동합니다.)

+0

내 이해를 넓힐 기회를 가져 주셔서 감사합니다, 키이스. 내 셸 - Fu는 그렇게 될 수있는만큼 좋은되지 않습니다 내 가정 내 제한된 경험으로 만들었습니다. 매일 새로운 것을 배우십시오. :디 –

9

일반적으로 두 가지 방식으로 작동하는 것으로 보입니다. See here. 나는 공간없는 버전이 오늘날 훨씬 더 일반적이며, 나에게 훨씬 매력적이라고 ​​말할 수있다.

사실, 이것은 특별히 Perl과 관련이 없습니다 (그러나 프로그래밍과 관련이 있습니다).

+1

그 링크가 너무 놀라 울 정도로 조사되어 +1이 당신에게 문질러옵니다. – ikegami