У сценаріїв не обов'язково є шебанг
Якщо сценарій був запущений з інтерпретатора, Ви не можете бути впевнені , що він має притон взагалі . Сценарії, запущені від інтерпретатора, не потребують шебанг , якщо ви зателефонуєте перекладачеві для запуску коду.
Відповідь - ні, немає команди, яка б точно дізналася, якою є мова (інтерпретатор), з якою слід запускати скрипт. Однак ви завжди можете зазирнути в сценарій і побачити, чи є у нього шебанг, щоб це дізнатися.
Коротше кажучи правила:
- Під час запуску сценарію виклик перекладача завжди перекриває можливі шебанги, виконувані чи ні, шебанг чи ні.
- Якщо він не виконується і запускається від інтерпретатора, сценарій не потребує шебанг.
- Якщо сценарій запускається без виклику перекладача спочатку, йому потрібен (і використовує) шебанг, щоб з’ясувати, який інтерпретатор викликати, і його потрібно виконати, щоб мати «дозвіл» викликати перекладача зі свого шебангу.
Якщо у сценарію немає шебанга, всередині сценарію немає (прямої *) інформації, яка б розповіла, який інтерпретатор використовувати.
Сказавши, що
Звичайно, ви завжди можете написати скрипт для обгортки, щоб спробувати з'ясувати, чи є у скрипту шебанг, і прочитати з нього інтерпретатора, а потім запустити його від знайденого інтерпретатора.
Приклад
#!/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.
(* Звичайно, можна розробити "розумний" алгоритм відгадки для визначення синтаксису з коду.)