Измените исполняемый файл по умолчанию для файла с потенциально отсутствующим shebang

Измените исполняемый файл по умолчанию для файла с потенциально отсутствующим shebang

У меня есть библиотека - пользователи должны создавать исполняемые файлы, потенциально с хэшбэнгом, чтобы указать, 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не будут этого делать.

Что именно происходит, когда я запускаю файл в своей оболочке?содержит гораздо больше подробностей по этой теме.

Связанный контент