그래서 나는 이것에 대해 잘 이해하고 있다고 생각했지만 테스트를 실행했는데 (내가 누군가와 동의하지 않은 대화에 대한 응답으로) 내 이해에 결함이 있음을 발견했습니다 ...
가능한 한 자세하게 쉘에서 파일을 실행할 때 정확히 어떤 일이 발생합니까? 내 말은 ./somefile some arguments
쉘에 입력하고 return 키를 누른 somefile
다음 cwd에 있고에 대한 읽기 + 실행 권한이 somefile
있는 경우 후드에서 어떻게됩니까?
나는 그 대답이 다음과 같다고 생각 했다.
- 쉘
exec
은 경로를 전달하여 syscall을 만듭니다.somefile
- 커널은 파일 의 매직 번호 를 검사
somefile
하고 프로세서가 처리 할 수있는 형식인지 확인합니다. - 매직 번호가 파일이 프로세서가 실행할 수있는 형식임을 나타내는 경우
- 새 프로세스가 작성됩니다 (프로세스 테이블에 항목이 있음).
somefile
메모리에 읽히거나 매핑됩니다. 스택이 생성되고 실행 이 매개 변수의 배열 (a , )somefile
로ARGV
초기화 된 코드의 진입 점으로 이동합니다.char**
["some","arguments"]
- 매직 넘버가 shebang 인 경우
exec()
위와 같이 새 프로세스 를 생성하지만 사용 된 실행 파일은 shebang이 참조하는 인터프리터 (예 :/bin/bash
또는/bin/perl
)somefile
로 전달됩니다.STDIN
- 파일에 유효한 마법 번호가 없으면 "잘못된 파일 (잘못된 마법 번호) : Exec 형식 오류"와 같은 오류가 발생합니다.
그러나 누군가 파일이 일반 텍스트 인 경우 쉘은 명령을 실행하려고한다고 말합니다 (입력 한 것처럼 bash somefile
). 나는 이것을 믿지 않았지만 방금 시도했지만 정확했습니다. 그래서 나는 실제로 여기서 일어나는 일에 대해 약간의 오해를 가지고 있으며 그 역학을 이해하고 싶습니다.
쉘에서 파일을 실행할 때 정확히 어떻게됩니까? (자세한 내용은 합리적입니다 ...)
source somefile
./somefile
하지만 새로운 프로세스와는 다릅니다 .
./somefile
bash가 명령을 실행하게 될 것이라고 생각 somefile
하지 않았습니다. 나는 그것이 단지 오류를 표시 할 것이라고 생각했고, 대신 그것은 효과적으로 나타납니다source somefile
somefile
. 텍스트 파일 인 경우 실행하려고하면 새 쉘이 생성된다는 것을 확인할 수 있습니다. echo $$
소스와 소스를 실행하면 파일 이 다르게 동작합니다.