Итак, я подумал, что хорошо понимаю это, но просто провел тест (в ответ на разговор, в котором я с кем-то не согласен) и обнаружил, что мое понимание неверно ...
Как можно более подробно, что именно происходит, когда я запускаю файл в моей оболочке? Что я имею в виду, если я ввожу : ./somefile some argumentsв свою оболочку и somefileнажимаю return (и существует в cwd, и у меня есть разрешения на чтение + выполнение somefile), то что происходит под капотом?
Я думал, что ответ был:
- Оболочка делает системный вызов
exec, минуя путь кsomefile - Ядро проверяет
somefileи просматривает магический номер файла, чтобы определить, является ли этот формат обработчиком - Если магическое число указывает, что файл находится в формате, который процессор может выполнить, то
- создается новый процесс (с записью в таблице процессов)
somefileчитается / отображается в память Стек создается, и выполнение переходит к точке входа кодаsomefile, сARGVинициализированным массивом параметров (achar**,["some","arguments"])
- Если магическое число представляет собой шебанг, то
exec()запускается новый процесс, как указано выше, но используемый исполняемый файл является интерпретатором, на который ссылается шебанг (например,/bin/bashили/bin/perl), иsomefileпередаетсяSTDIN - Если в файле нет действительного магического номера, возникает ошибка типа «неверный файл (неправильное магическое число): ошибка формата Exec»
Однако кто-то сказал мне, что если файл представляет собой простой текст, то оболочка пытается выполнить команды (как будто я набрал bash somefile). Я не верил в это, но я просто попробовал, и это было правильно. Поэтому у меня явно есть некоторые неправильные представления о том, что на самом деле здесь происходит, и я хотел бы понять механику.
Что именно происходит, когда я запускаю файл в моей оболочке? (насколько подробно это разумно ...)
source somefileочень сильно отличается от нового процесса, который был отменен ./somefile.
./somefileэто приведет к тому, что bash выполнит команды, somefileесли в файле нет магического числа. Я думал, что это просто отобразит ошибку, и вместо этого, по-видимому, эффективноsource somefile
somefileтекстовый файл, то новая оболочка появляется, если я пытаюсь выполнить его. Файл echo $$ведет себя по-разному, если я выполняю его против исходного кода.