예를 들어 내가 그렇게 하면
[OP@localhost executable]$ cat garbage
lalala
trololol
[OP@localhost executable]$ chmod +x garbage
[OP@localhost executable]$ ./garbage
./garbage: line 1: lalala: command not found
./garbage: line 2: trololol: command not found
Bash는 이 "실행 파일"을 스크립트로 해석하려고 하는 것 같습니다. 그러나 이것이 분명히 발생하지 않는 두 가지 상황이 있습니다. 파일이 로 시작하는 경우 #!
와 ELF 파일인 경우입니다. 더 이상 없나요? 이에 대한 포괄적인 문서가 어딘가에 있습니까?
답변1
확장됨다른 답변에 대한 내 이전 의견, 커널7개의 바이너리 로더가 포함되어 있습니다.(There로 시작하는 파일을 찾 binfmt_
거나 읽어보세요.binfmt
구체적인Kconfig
):
a.out
(현재집행정지);- 극히 낮은 주파수;
- FDPIC ELF(ARM, MMU가 없는 SuperH 및 C6x);
em86
(알파);- 플랫 바이너리(MMU가 없는 시스템, ARM 또는 M68k)
- 스크립트;
- 전능자
binfmt_misc
(당신은 또한 볼 수 있습니다/proc/sys/fs/binfmt_misc/ 아래의 파일에는 어떤 유형의 실행 파일 형식이 허용됩니까?).
이는 커널이 실행할 수 있는 실행 파일의 유형을 결정합니다. binfmt_misc
특히 커널이 다른 많은 바이너리를 처리할 수 있도록 허용합니다(적어도 호출 프로세스의 관점에서 볼 때).exec
기능 중 하나).
그러나 C 라이브러리와 셸 자체도 포함되므로 이것이 모든 것을 다루지는 않습니다. POSIX에서는 이제 커널이 실행할 수 없는 실행 파일을 발견할 때 셸을 사용하여 실행을 시도하는 기능이 execlp
필요 합니다.execvp
이유는 여기에 있다더 알아보기.
이들 모두는 다음에서 볼 수 있는 동작을 제공하는 방식으로 상호 작용합니다.쉘에서 파일을 실행하면 정확히 무슨 일이 발생합니까?그리고Shebang 없이 스크립트를 실행하는 쉘 인터프리터는 무엇입니까?