Ich habe eine Bibliothek – Benutzer sollen ausführbare Dateien erstellen, möglicherweise mit einem Hashbang, der angibt, exec
welche ausführbare Datei verwendet werden soll. Wenn sie den Hashbang weglassen, verwenden die meisten Systeme meiner Meinung nach standardmäßig . /bin/sh
Ich möchte diese Standardeinstellung ändern.
Einige Dateien beginnen möglicherweise mit:
#!/usr/bin/env foobar
Andere Dateien könnten mit folgendem beginnen:
#!/usr/bin/env perl
oder
#!/usr/bin/env ruby
Und in manchen Fällen lässt der Benutzer den Hashbang ganz weg. In diesem Fall führe ich die Datei trotzdem direkt aus und möchte standardmäßig die foobar
ausführbare Datei verwenden.
Mit anderen Worten, ich weiß nicht im Voraus, was das Hashbang sein wird, und ich möchte, dass der Standardwert statt ist foobar
, /bin/sh
wenn kein Hashbang vorhanden ist.
Ich denke, die Vorgehensweise bei meinem Vorhaben besteht darin, exec
zunächst eine ausführbare Datei zu erstellen und, wenn dies mit einer bestimmten Fehlermeldung fehlschlägt, das Skript dann indirekt mit der foobar
ausführbaren Datei auszuführen?
Etwas wie das:
function run {
stdio=$("$1" 2>&1)
if [[ stdout/stderr matches a certain error message ]]; then
foobar $1
fi
}
Meine Frage ist: Weiß jemand, wovon ich spreche? Und weiß jemand, wie ich standardmäßig auf eine bestimmte ausführbare Datei zurückgreifen kann, wenn kein Hashbang vorhanden ist? Nicht, dass es theoretisch weniger praktisch wäre, zu prüfen, ob ein Hashbang vorhanden ist, sondern theoretisch praktischer, es einfach auszuführen.
Antwort1
Sie können dies in zwei Schritten implementieren, indem Sie verwenden execve
: Bitten Sie die C-Bibliothek, den Kernel aufzufordern, das Ziel auszuführen, und wenn dies fehlschlägt, versuchen Sie es erneut mit foobar
. Dies ist tatsächlich die Art und Weise, wie Shells die Ausführung üblicherweise implementieren.
Es gibt andere exec
Familienfunktionen, die Shebang-lose Skripte mit ausführen /bin/sh
, aber execve
nicht.
Was genau passiert, wenn ich eine Datei in meiner Shell ausführe?enthält viel mehr Einzelheiten zu diesem Thema.