Altere o executável padrão do arquivo com shebang potencialmente ausente

Altere o executável padrão do arquivo com shebang potencialmente ausente

Eu tenho uma biblioteca - os usuários devem criar arquivos executáveis, potencialmente com um hashbang para informar execqual 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 foobarexecutável como padrão.

Em outras palavras, não sei qual será o hashbang com antecedência e quero que o padrão seja foobarem 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 execprimeiro e, se falhar com uma mensagem de erro específica, executar o script indiretamente com o foobarexecutá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 execfunções familiares que executarão scripts sem shebang com /bin/sh, mas execvenão o farão.

O que exatamente acontece quando executo um arquivo no meu shell?tem muito mais detalhes sobre esse assunto.

informação relacionada