2010-11-27 6 views
1

마치 #! prefix는 인터프리터 이름과 하나의 인수 만 가질 수 있습니다. 따라서 :#의 한계! 스크립트에서

#!/bin/ls -l 

작동하지만

#!/usr/bin/env ls -l 

당신이 동의하지 않는? 이견있는 사람?

Francesc

답변

2

다른 유닉스는 #! 다르게. 다음은 포괄적 인 내용을 담은 글입니다. http://www.in-ulm.de/~mascheck/various/shebang/

플랫폼 전반에 걸쳐 가장 낮은 공통 분모는 "인터프리터 (자체는 스크립트가 아니어야 함)이며 하나 이상의 인수가 아닌 것 같습니다."

+0

매우 명확한 답변, 감사합니다. – francesc

-1

원래 유닉스에는 하나의 쉘만있었습니다. 명령을 실행하도록 요청하면 쉘은 exec() 시스템 호출 중 하나를 호출하려고 시도합니다. 명령이 실행 가능하면 exec가 성공하고 명령이 실행됩니다. exec()가 실패하면 쉘은 포기하지 않고 쉘 스크립트처럼 명령 파일을 해석하려고 시도합니다.

그런 다음 유닉스에 쉘이 많아지고 혼란스러워졌습니다. 대부분의 사람들은 한 쉘에 스크립트를 작성하고 다른 쉘에 명령을 입력합니다. 그리고 각 쉘에는 통역사에게 스크립트를 제공하는 데있어 다른 규칙이있었습니다.

"#!/"트릭이 발명되었습니다. 아이디어는 커널의 exec() 시스템 호출이 쉘 스크립트로 성공하도록하는 것이었다. 커널이 파일을 exec()하려고 할 때 매직 넘버라는 정수를 나타내는 처음 4 바이트를 봅니다. 이것은 커널에게 파일 실행 여부를 알려줍니다. 그래서 "#!/"는 커널이 알고있는 마법 번호에 추가되었으며 실제로 자체적으로 쉘 스크립트를 실행할 수 있도록 확장되었습니다. 그러나 어떤 사람들은 "#!/", 그들은 공간을 밖으로두고 있었다. 그래서 커널은 "#! /"가 특별한 3 바이트 매직 넘버로 작동 할 수 있도록 다시 사용되었습니다.