какая функция в Linux API реализует выполнение файла скрипта с шебангом? - PullRequest
0 голосов
/ 02 мая 2018

С https://unix.stackexchange.com/a/2910/674

... как обычно реализуется шебанг (#!):

  1. Ядро открывает исполняемый файл и находит, что оно начинается с #!.
  2. Ядро закрывает исполняемый файл и вместо него открывает интерпретатор.
  3. Ядро вставляет путь к сценарию в список аргументов (как argv [1]) и выполняет интерпретатор.

Мне было интересно, какая функция в Linux API реализует описанные выше шаги для выполнения файла сценария с шебангом?

Я рассмотрел следующие возможности, но ни одна из них не кажется подходящей:

  • execve() не сможет выполнить скрипт.
  • Либо execlp(), либо execvp(), кажется, просто для выполнения сценарий без какого-либо шебанга, по умолчанию /bin/sh, в соответствии с APUE:

    Если execlp() или execvp() находит исполняемый файл, используя один из путь префиксов, но файл не является исполняемым файлом компьютера, который был генерируемая редактором ссылок, функция предполагает, что файл является сценарий оболочки и пытается вызвать /bin/sh с именем файла в качестве ввода для оболочка.

    Может ли execlp() или execvp() выполнить скрипт с шебангом для переводчика любого языка (Python, Perl, Bash, ...).

Спасибо.

1 Ответ

0 голосов
/ 03 мая 2018

Должно быть реализовано execve(). Все остальные функции в семействе exec являются просто обертками (те, которые заканчиваются на p, выполняют поиск $PATH, чтобы найти исполняемый аргумент, а те, которые l, строят массив argv путем итерации по список аргументов переменной).

Он работает так же для интерпретатора любого языка - механизм на самом деле не заботится о том, что делает программа в строке shebang, он просто выполняет его с именем пути сценария в качестве аргумента. Вы даже можете сделать:

#!/bin/cat

для создания файла, который просто печатает сам себя при запуске.

...