Сценарии не обязательно имеют шебанг
Если скрипт был запущен от переводчика, Вы не можете быть уверены, что он имеет шебанг вообще . Скрипты, запускаемые из интерпретатора, не нуждаются в шебанге , если вы вызываете интерпретатор для запуска кода.
Таким образом, ответ - нет, нет команды, которая бы точно знала, на каком языке (интерпретаторе) запускать скрипт. Однако вы всегда можете заглянуть внутрь сценария и посмотреть, есть ли у него шебанг, чтобы узнать.
Правила вкратце:
- Когда вы запускаете скрипт, вызов интерпретатора всегда отменяет возможные shebang, исполняемые или нет, shebang или нет.
- Если скрипт не исполняется и запускается из интерпретатора, сценарий не нуждается в шебанге.
- Если скрипт запускается без предварительного вызова интерпретатора, ему нужен (и использует) шебанг, чтобы узнать, какой интерпретатор вызывать, и он должен быть исполняемым, чтобы иметь «разрешение» на вызов интерпретатора из своего шебанга.
Однако, если в сценарии нет шебанга, в сценарии нет (прямой *) информации, указывающей, какой интерпретатор использовать.
Было сказано, что
Конечно, вы всегда можете написать скрипт-обертку, чтобы попытаться выяснить, есть ли у скрипта шебанг, и прочитать интерпретатор из него, а затем запустить его из найденного интерпретатора.
Пример
#!/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")
Сохраните его как tryrun
в $PATH
(например ~/bin
, сделайте каталог, если он не существует, выйдите из системы и войдите обратно), сделайте его исполняемым . Затем работает:
tryrun /path/to/nonexecutablescript
вызывает (проверял) правильный интерпретатор моих неисполняемых файлов python
и bash
скриптов.
объяснение
- Сценарий просто читает первую строку сценария, удаляет
#!
и использует остальное для вызова интерпретатора.
- Если он не может вызвать допустимого интерпретатора, он вызовет либо a,
PermissionError
либо a FileNotFoundError
.
Запись
Расширение ( .sh
и .py
т. Д.) Не играет никакой роли при определении соответствующего интерпретатора в Linux.
(* Конечно, можно разработать «умный» алгоритм предположения для определения синтаксиса из кода.)