Os scripts não têm necessariamente um shebang
Se o script foi executado a partir do intérprete, Você não pode ter certeza de que tem o shebang em tudo . Os scripts, executados no intérprete, não precisam do shebang , se você chamar o intérprete para executar o código.
A resposta é, portanto, não, não há nenhum comando que descubra com certeza qual é o idioma (intérprete) para executar o script. No entanto, você sempre pode olhar dentro do script e ver se ele tem o que descobrir.
As regras em resumo:
- Quando você executa o script, chamar o intérprete sempre anula possíveis shebangs, executáveis ou não, shebang ou não.
- Se não for executável e executado a partir do intérprete, o script não precisa de shebang.
- Se o script for executado sem chamar o intérprete primeiro, ele precisa (e usa) o shebang para descobrir qual intérprete chamar e precisa ser executável para ter a "permissão" para chamar o intérprete a partir do shebang.
Se o script não tiver shebang, no entanto, não há informações (diretas *) dentro do script para dizer qual intérprete usar.
Tendo dito isto
É claro que você sempre pode escrever um script de invólucro para tentar descobrir se o script possui o shebang e ler o intérprete a partir dele e, posteriormente, executá-lo a partir do intérprete encontrado.
Um exemplo
#!/usr/bin/env python3
import subprocess
import sys
args = sys.argv[1:]; script = args[0]
try:
lang = open(script).readlines()[0].replace("#!", "").strip().split()[-1]
cmd = [lang, script]+args[1:]
subprocess.call(cmd)
except (PermissionError, FileNotFoundError, IndexError):
print("No valid shebang found")
Salve-o como tryrun
em $PATH
(por exemplo ~/bin
, torne o diretório se ele não existir, efetue logout e logon novamente), torne-o executável . Em seguida, executando:
tryrun /path/to/nonexecutablescript
chamadas (testado) O intérprete correta no meu não-executável python
e bash
scripts.
Explicação
- O script simplesmente lê a primeira linha do script, remove
#!
e usa o restante para chamar o intérprete.
- Se não conseguir chamar um intérprete válido, ele exibirá a
PermissionError
ou a FileNotFoundError
.
Nota
A extensão ( .sh
, .py
etc) não desempenha nenhum qualquer papel na determinação do intérprete apropriado no Linux.
(* É claro que é possível desenvolver um algoritmo de adivinhação "inteligente" para determinar a sintaxe do código.)