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

0

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, então eu acho que a maioria dos sistemas padrão para /bin/sh , eu quero mudar 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á totalmente o hashbang. Nesse caso, ainda vou executar o arquivo diretamente, e quero usar como padrão o executável foobar .

Em outras palavras , não sei qual será o hashbang antecipadamente 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 executar exec primeiro, e se isso falhar com uma mensagem de erro específica, execute o script indiretamente com o foobar executável?

Algo parecido com isto:

function run {
  stdio=$("$1" 2>&1)
  if [[ stdout/stderr matches a certain error message ]]; then
    foobar $1
  fi
}

A minha pergunta é - alguém sabe do que estou a falar - e alguém sabe como posso predefinir um executável em particular se não houver hashbang? Não que seja em teoria menos conveniente checar se há um hashbang, e mais em teoria mais conveniente apenas para executá-lo?

    
por Alexander Mills 24.11.2017 / 21:11

1 resposta

2

Você pode implementar isso em duas etapas usando execve : peça à biblioteca C para solicitar que o kernel execute o destino e, se isso falhar, tente novamente com foobar . Na verdade, é como os shells normalmente implementam a execução.

Existem outras funções da família exec que executam scripts sem shebang com /bin/sh , mas execve não.

O que exatamente acontece quando eu executo um arquivo no meu shell? tem muito mais detalhes sobre esse tópico.

    
por 24.11.2017 / 22:48