Итак, я подумал, что хорошо понимаю это, но просто провел тест (в ответ на разговор, в котором я с кем-то не согласен) и обнаружил, что мое понимание неверно ...
Как можно более подробно, что именно происходит, когда я запускаю файл в моей оболочке? Что я имею в виду, если я ввожу : ./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 $$
ведет себя по-разному, если я выполняю его против исходного кода.