추가 항목이 #
항상 뾰족한 느낌표를 상쇄합니까? 좋다:
활성화됨:
#!/foo/bar
장애인:
##!/foo/bar
당신은 가지고 있습니까?모두 다 아는exec가 실행될 수 있습니까? 인식되는 매직 환경이 있습니까 bar
?\x23\x23\x21...
답변1
훌륭한,POSIX 표준어쨌든 할 말이 없습니다 :
일반적인 역사적 구현은 execl(), execv(), execle() 및 execve() 함수가 실행 파일(셸 스크립트 포함)로 인식되지 않는 모든 파일에 대해 [ENOEXEC] 오류를 반환한다는 것입니다. execlp() 및 execvp() 함수는 이러한 파일을 발견하면 해당 파일이 쉘 스크립트라고 가정하고 해당 파일을 해석하는 것으로 알려진 명령 해석기를 호출합니다. POSIX.1-2008에서는 이제 이것이 필요합니다. execvp() 및 execlp()의 이러한 구현은 명령 해석기의 실행 파일에 문제가 있는 드문 경우에만 [ENOEXEC] 오류를 발생시킵니다. 이러한 구현으로 인해 execlp() 또는 execvp()에 대한 [ENOEXEC] 오류에 대한 언급은 없지만 구현에서는 여전히 오류가 발생할 수 있습니다.
일부 역사적 구현이 쉘 스크립트를 처리하는 또 다른 방법은 파일의 처음 2바이트를 "#!" 문자열로 인식하고 파일의 첫 번째 줄의 나머지 부분을 실행할 명령 해석기의 이름으로 사용하는 것이었습니다.
표준 개발자가 지적한 혼란의 한 가지 잠재적인 원인은 프로세스 이미지 파일의 내용이 exec 기능 계열의 동작에 어떤 영향을 미치는가입니다. 다음은 취해진 조치에 대한 설명입니다.
프로세스 이미지 파일이 시스템에 유효한 실행 파일(적절한 권한이 있는 실행 가능하고 유효한 형식)인 경우 시스템은 파일을 실행합니다.
프로세스 이미지 파일에 적절한 권한이 있고 실행 가능하지만 시스템에 유효하지 않은 형식(예: 다른 아키텍처에 대해 인식된 바이너리)인 경우 이는 오류이며 errno는 [EINVAL]로 설정됩니다(이유 참조). 뒤에 ) on [EINVAL]).
프로세스 이미지 파일에 적절한 권한이 있지만 인식되지 않는 경우:
이것이 execlp() 또는 execvp()에 대한 호출인 경우 명령 해석기를 호출하고 프로세스 이미지 파일이 쉘 스크립트라고 가정합니다.
execlp() 또는 execvp()에 대한 호출이 아닌 경우 오류가 발생하고 errno는 [ENOEXEC]로 설정됩니다.
지정하지 않았음을 알 수 있습니다.어떻게3.1의 명령 해석기가 인식됩니다.
하지만리눅스, shebang이 #!
정확하게 시작되도록 요구합니다. 바라보다man 2 execve
:
execve() executes the program pointed to by filename. filename must
be either a binary executable, or a script starting with a line of
the form:
#! interpreter [optional-arg]
그리고 이것은 Shebang이 다른 효과 없이 제거되는 것처럼 보이는 #
이유인 만큼 충분히 일반적인 해설 문자입니다 . ##!
그러나 스크립트는 여전히 실행을 사용하므로 sh
, 그렇지 않더라도 /foo/bar
예상한 결과가 아닐 수도 있습니다. 바라보다man 3 exec
:
If the header of a file isn't recognized (the attempted execve(2)
failed with the error ENOEXEC), these functions will execute the
shell (/bin/sh) with the path of the file as its first argument. (If
this attempt fails, no further searching is done.)
나는 그 이외의 shebang을 허용하는 시스템을 모르고 #!
그것이 특별히 취급될 것이라고 확실히 의심 ##!
하지만 확실히 가능합니다. 표준은 그것을 배제하지 않습니다.