[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