Skripte müssen nicht unbedingt einen Wahnsinn haben
Wenn das Skript aus dem Interpreter ausgeführt wurde, können Sie nicht sicher sein , den shebang hat überhaupt . Skripte, die vom Interpreter ausgeführt werden, benötigen den shebang nicht , wenn Sie den Interpreter aufrufen, um den Code auszuführen.
Die Antwort lautet daher "Nein". Es gibt keinen Befehl, der mit Sicherheit herausfindet, in welcher Sprache (mit welchem Interpreter) das Skript ausgeführt werden soll. Sie können jedoch immer in das Drehbuch schauen und sehen, ob es das Zeug dazu hat, es herauszufinden.
Die Regeln in Kürze:
- Wenn Sie das Skript ausführen, überschreibt der Aufruf des Interpreters immer mögliche Shebangs, ausführbar oder nicht, Shebang oder nicht.
- Wenn es nicht ausführbar ist und vom Interpreter ausgeführt wird, benötigt das Skript kein Problem.
- Wenn das Skript ausgeführt wird, ohne zuerst den Interpreter aufzurufen, benötigt (und verwendet) es den Shebang, um herauszufinden, welcher Interpreter aufgerufen werden soll, und es muss ausführbar sein, um die "Berechtigung" zu haben, den Interpreter von seinem Shebang aus aufzurufen.
Wenn das Skript jedoch keinen Shebang hat, gibt es keine (direkten *) Informationen im Skript, die angeben, welcher Interpreter verwendet werden soll.
Nachdem ich das gesagt habe
Sie können natürlich jederzeit ein Wrapper-Skript schreiben, um herauszufinden, ob das Skript den Shebang enthält, und den Interpreter daraus lesen. Anschließend können Sie es über den gefundenen Interpreter ausführen.
Ein Beispiel
#!/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")
Speichern Sie es als tryrun
in $PATH
( ~/bin
machen Sie das Verzeichnis, wenn es nicht existiert, melden Sie sich ab und wieder an), machen Sie es ausführbar . Dann läuft:
tryrun /path/to/nonexecutablescript
ruft (getestet) den richtigen Interpreter für meine nicht ausführbaren Dateien python
und bash
Skripte auf.
Erläuterung
- Das Skript liest einfach die erste Zeile des Skripts, entfernt die
#!
und verwendet den Rest, um den Interpreter aufzurufen.
- Wenn kein gültiger Interpreter aufgerufen wird, wird entweder a
PermissionError
oder a ausgelöst FileNotFoundError
.
Hinweis
Die Erweiterung ( .sh
, .py
usw.) spielt überhaupt keine Rolle in dem entsprechenden Interpreter auf Linux zu bestimmen.
(* Es ist natürlich möglich, einen "intelligenten" Schätzalgorithmus zu entwickeln, um die Syntax aus dem Code zu bestimmen.)