Если execve(2)
возвращает ошибку и устанавливает errno
на ENOEXEC
, все оболочки будут пытаться запустить исполняемый файл в виде сценария оболочки, т.е.они будут выполнять оболочку с файлом, указанным в качестве аргумента.Пустой сценарий будет иметь нулевое состояние выхода (= успех) [1].
Какая оболочка будет запускаться, зависит: bash
, ksh93
и yash
запустят сценарий самостоятельно;csh
, dash
, zsh
или mksh
всегда будут запускать его, используя /bin/sh
.
Это поведение очень старое и предшествует функции she-bang и стандартизированным форматам исполняемых файлов, иэто также требуется стандартом - прочитайте раздел 2. Поиск и выполнение команд из стандарта.
execve
выход -1
с ENOEXEC
Exec format error
так что это не поведение операционной системы.
Это, однако, стандартное необходимое поведение для оболочек библиотеки execvp()
и execlp()
:
В случае, если другие члены семейства функций exec потерпят неудачу и установят errno
в ENOEXEC
, функции execlp()
и execvp()
должны выполнить интерпретатор команд, а среда исполняемой команды должнабыть так, как если бы процесс вызвал утилиту sh
, используя execl()
следующим образом:
execl(<shell path>, arg0, file, arg1, ..., (char *)0);`
[1] В старой системе /bin/true
был файл, состоящий только из уведомления об авторских правах, сообщая, что это"неопубликованный проприетарный исходный код AT& Т».