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 quero 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 /bin/sh
, se não houver nenhum hashbang presente.
Acho que a maneira de fazer o que estou fazendo é criar um executável que possa ser executado exec
primeiro e, se falhar com uma mensagem de erro específica, executar 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, em teoria, menos conveniente verificar se existe um hashbang e, em teoria, mais conveniente apenas executá-lo?
Responder1
Você pode implementar isso em duas etapas usando execve
: peça à biblioteca C para solicitar ao kernel para executar o destino e, se isso falhar, tente novamente com foobar
. Na verdade, é assim que os shells geralmente implementam a execução.
Existem outras exec
funções familiares que executarão scripts sem shebang com /bin/sh
, mas execve
não o farão.
O que exatamente acontece quando executo um arquivo no meu shell?tem muito mais detalhes sobre esse assunto.