Ändern Sie die Standard-ausführbare Datei für Dateien mit möglicherweise fehlendem Shebang

Ändern Sie die Standard-ausführbare Datei für Dateien mit möglicherweise fehlendem Shebang

Ich habe eine Bibliothek – Benutzer sollen ausführbare Dateien erstellen, möglicherweise mit einem Hashbang, der angibt, execwelche ausführbare Datei verwendet werden soll. Wenn sie den Hashbang weglassen, verwenden die meisten Systeme meiner Meinung nach standardmäßig . /bin/shIch 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 foobarausfü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/shwenn kein Hashbang vorhanden ist.

Ich denke, die Vorgehensweise bei meinem Vorhaben besteht darin, execzunächst eine ausführbare Datei zu erstellen und, wenn dies mit einer bestimmten Fehlermeldung fehlschlägt, das Skript dann indirekt mit der foobarausfü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 execFamilienfunktionen, die Shebang-lose Skripte mit ausführen /bin/sh, aber execvenicht.

Was genau passiert, wenn ich eine Datei in meiner Shell ausführe?enthält viel mehr Einzelheiten zu diesem Thema.

verwandte Informationen