Skrypty niekoniecznie mają shebang
Jeśli skrypt był uruchamiany z tłumacza, nie możesz być pewien, że ma shebang w ogóle . Skrypty uruchamiane z interpretera nie wymagają shebang , jeśli wywołasz interpretera w celu uruchomienia kodu.
Odpowiedź brzmi więc nie, nie ma polecenia, które na pewno dowie się, w jakim języku (tłumaczu) uruchamia się skrypt. Zawsze możesz jednak zajrzeć do skryptu i sprawdzić, czy zawiera on shebang.
Zasady w skrócie:
- Po uruchomieniu skryptu wywołanie interpretera zawsze unieważnia możliwe sekwencje, pliki wykonywalne lub nie, sekwencje lub nie.
- Jeśli skrypt nie jest wykonywalny i uruchamiany z interpretera, skrypt nie wymaga shebang.
- Jeśli skrypt jest uruchamiany bez uprzedniego wywołania interpretera, potrzebuje (i używa) shebang, aby dowiedzieć się, do którego tłumacza ma zadzwonić, i musi być wykonywalny, aby mieć „pozwolenie” na wywołanie interpretera z jego shebang.
Jeśli jednak skrypt nie ma shebang, w skrypcie nie ma żadnych informacji (bezpośrednich *), które wskazywałyby, jakiego interpretera użyć.
To powiedziawszy
Można oczywiście zawsze napisać skrypt otoki, aby spróbować dowiedzieć się, czy skrypt ma shebang i przeczytać, że od tłumacza, a następnie uruchomić go z Znaleziony tłumacza.
Przykład
#!/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")
Zapisz go jako tryrun
w $PATH
(na przykład ~/bin
, zrobić katalog, jeśli nie istnieje, wylogować iz powrotem), sprawiają, że wykonywalny . Następnie uruchom:
tryrun /path/to/nonexecutablescript
wywołuje (testowany) poprawny interpreter na moich plikach wykonywalnych python
i bash
skryptach.
Wyjaśnienie
- Skrypt po prostu odczytuje pierwszy wiersz skryptu, usuwa
#!
i używa reszty do wywołania tłumacza.
- Jeśli nie zadzwoni do poprawnego tłumacza, podniesie albo a
PermissionError
albo FileNotFoundError
.
Uwaga
Rozszerzenie ( .sh
, .py
etc) w ogóle nie odgrywa żadnej roli w określaniu odpowiedniego tłumacza w systemie Linux.
(* Oczywiście możliwe jest opracowanie „inteligentnego” algorytmu zgadywania w celu określenia składni na podstawie kodu).