Wenn ich ein Bash-Skript ausführen möchte, dessen Ausführungsberechtigung nicht festgelegt ist, kann ich Folgendes tun:
bash script.sh
Was soll ich bash
tun, wenn das Skript nicht ausführbar ist und ich den richtigen Interpreter nicht kenne? Gibt es einen Befehl, der den Interpreter von shebang line aus aufruft und das Skript damit ausführt?
bash whatever
funktioniert, warum etwas anderes verwenden? bash ist auf nahezu jedes * ix - System zur Verfügung, also warum die Mühe ...Antworten:
Ja. Es heißt
perl
:Dies wird in der Dokumentation von Perl erwähnt :
quelle
.js
auch?#!
. Ich scheine jetzt ein paar zu mehr und habe dieses Problem nicht erfahren.man perlrun
verlegen zugibt, dass es "etwas bizarr" ist :). Ich denke, dies sollte als eine Kuriosität behandelt werden, die sich an Nicht-UNIX-Umgebungen und sehr sehr alte Versionen von UNIX richtet .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 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
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:ruft (getestet) den richtigen Interpreter für meine nicht ausführbaren Dateien
python
undbash
Skripte auf.Erläuterung
#!
und verwendet den Rest, um den Interpreter aufzurufen.PermissionError
oder a ausgelöstFileNotFoundError
.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.)
quelle
Sie können dies mit einem Skript wie dem folgenden erreichen:
Somit:
Ich empfehle dagegen. Berechtigungen gibt es aus einem Grund. Dies ist ein Programm zum Umkehren von Berechtigungen.
Beachten Sie, dass shebang handling eine Kernelfunktion ist (im Linux-Quellcode -
fs/binfmt_script.c
). Grundsätzlich weiß der Prozess, der ein Skript direkt aufruft, nichts über das#!
- der Kernel verwendet es, um herauszufinden, dass er einen Interpreter starten muss.quelle