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