Отже, я подумав, що я добре розумію це, але просто пройшов тест (у відповідь на розмову, де я з кимось не погодився) і виявив, що моє розуміння є хибним ...
Як можна детальніше, що саме відбувається, коли я виконую файл у своїй оболонці? Що я маю на увазі, якщо я набираю : ./somefile some arguments
у свою оболонку і натискаю return (і somefile
існує в 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 $$
поводиться інакше, якщо я виконую його проти джерела.