[Comm] no-shebang scripts, was: После обновления пропали иконки на рабочем столе
Dmitry Chistikov
dd1email на gmail.com
Пт Авг 31 11:18:12 MSK 2012
Денис Смирнов, Aug. 31, 2012, 10:49 +0400:
> On Fri, Aug 31, 2012 at 09:46:12AM +0400, Dmitry Chistikov wrote:
>
> DC> Или Вы про вот эту особенность:
> DC> If the header of a file isn't recognized (the attempted execve(2) failed with
> DC> the error ENOEXEC), these functions will execute the shell (/bin/sh) with the
> DC> path of the file as its first argument. (If this attempt fails, no further
> DC> searching is done.)
>
> Именно.
>
> DC> Короче говоря, если файл не является "настоящим" бинарником (a.out
> DC> dynamically linked binary executable, dynamically linked ELF executable)
> DC> и не является сценарием оболочки (interpreter script в терминах execve(2);
> DC> грубо говоря, в первой строке должен быть корректная #!-строка),
> DC> то системный вызов для него оболочку запускать и не будет. Заниматься
> DC> этой самодеятельностью будут разве что функции стандартной библиотеки -
> DC> или же пользовательские программы (возможно, и сами оболочки).
>
> Если я правильно понял последние две предложения, то execve попытается сам
> вызвать дефолтный /bin/sh, и только если обломается -- дальнейшеие попытки
> выполинть завершаться.
Н-ну... насколько я понимаю, не совсем так.
Если натравить системный вызов execve(2) на текстовый файл без шебанга, то
он обломается. Если на текстовый файл с корректным шебангом - то ядро
запустит соответствующий интерпретатор.
При этом обращение к execve(2) в трех из шести функций стандартной
библиотеки содержит специальные инструкции: в случае такого (ENOEXEC)
облома попробовать запустить оболочку (/bin/sh) с соответствующим
параметром. Остальные три функции такой возможности не предоставляют.
Кстати говоря, у Кернигана и Пайка в UPE никаких шебангов и вовсе не было,
а сценарии содержали просто код на языке оболочки. О появлении шебангов
есть два фрагмента в английской википедии: см. разделы Etymology и History
на странице http://en.wikipedia.org/wiki/Shebang_(Unix) . Если верить
приведенным объяснениям (цитируется Д. Ритчи!), ранее всю работу по
идентификации командных сценариев выполняла оболочка, а введение шебангов
позволило перепоручить это ядру.
--
Дмитрий Чистиков
Подробная информация о списке рассылки community