У меня есть библиотека - пользователи должны создавать исполняемые файлы, потенциально с хэшбэнгом, чтобы указать, exec
какой исполняемый файл использовать. Если они опускают хэшбэнг, то я думаю, что большинство систем по умолчанию используют /bin/sh
, я хочу изменить это значение по умолчанию.
Поэтому некоторые файлы могут начинаться с:
#!/usr/bin/env foobar
другие файлы могут начинаться с:
#!/usr/bin/env perl
или
#!/usr/bin/env ruby
А в некоторых случаях пользователь вообще пропустит хэшбэнг. В этом случае я все равно выполню файл напрямую, и я хочу по умолчанию использовать foobar
исполняемый файл.
Другими словами, я заранее не знаю, каким будет хэшбэнг, и хочу, чтобы значение по умолчанию было равно foobar
, а не /bin/sh
, если хэшбэнга нет.
Я думаю, что способ сделать то, что я делаю, — это создать исполняемый файл, который может быть запущен exec
первым, и если он завершится сбоем и выдаст определенное сообщение об ошибке, то запустить скрипт косвенно с помощью foobar
исполняемого файла?
Что-то вроде этого:
function run {
stdio=$("$1" 2>&1)
if [[ stdout/stderr matches a certain error message ]]; then
foobar $1
fi
}
Мой вопрос - кто-нибудь понимает, о чем я говорю - и кто-нибудь знает, как я могу использовать по умолчанию определенный исполняемый файл, если нет hashbang? Не то, чтобы в теории было менее удобно проверять, есть ли hashbang, а в теории более удобно просто запустить его?
решение1
Вы можете реализовать это в два этапа, используя execve
: попросить библиотеку C попросить ядро выполнить цель, и если это не удается, повторить попытку с помощью foobar
. На самом деле, именно так оболочки обычно реализуют выполнение.
Существуют и другие exec
функции семейства, которые будут запускать скрипты без шебанга с помощью /bin/sh
, но execve
не будут этого делать.
Что именно происходит, когда я запускаю файл в своей оболочке?содержит гораздо больше подробностей по этой теме.