Eu tenho uma biblioteca - os usuários devem criar arquivos executáveis, potencialmente com um hashbang para informar exec
qual executável usar. Se eles omitirem o hashbang, acho que o padrão da maioria dos sistemas é /bin/sh
, quero alterar esse padrão.
Portanto, alguns arquivos podem começar com:
#!/usr/bin/env foobar
outros arquivos podem começar com:
#!/usr/bin/env perl
ou
#!/usr/bin/env ruby
E, em alguns casos, o usuário omitirá completamente o hashbang. Nesse caso, ainda executarei o arquivo diretamente e desejo usar o foobar
executável como padrão.
Em outras palavras , não sei qual será o hashbang com antecedência e quero que o padrão seja foobar
em vez do padrão ser /bin/sh
, se não houver hashbang presente.
Acho que a maneira de fazer o que estou fazendo é criar um executável que possa ser executado exec
primeiro e, se isso falhar com uma mensagem de erro específica, execute o script indiretamente com o foobar
executável.
Algo assim:
function run {
stdio=$("$1" 2>&1)
if [[ stdout/stderr matches a certain error message ]]; then
foobar $1
fi
}
Minha pergunta é - alguém sabe do que estou falando - e alguém sabe como posso usar como padrão um executável específico se nenhum hashbang estiver presente? Não que seja teoricamente menos conveniente verificar se existe um hashbang e, teoricamente, mais conveniente apenas executá-lo?
Você pode implementar isso em duas etapas usando
execve
: peça à biblioteca C para solicitar ao kernel que execute o destino e, se isso falhar, tente novamente comfoobar
. Na verdade, é assim que os shells geralmente implementam a execução.Existem outras
exec
funções de família que executam scripts sem shebang com/bin/sh
, masexecve
não.O que exatamente acontece quando executo um arquivo no meu shell? tem muito mais detalhes sobre esse assunto.