GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Mehrere Argumente in Shebang?

Ich frage mich, ob es eine allgemeine Möglichkeit gibt, mehrere Optionen über die Shebang-Zeile (#! ).

Ich verwende NixOS, und der erste Teil des Krams in jedem Skript, das ich schreibe, ist normalerweise /usr/bin/env . Das Problem, auf das ich dann stoße, ist, dass alles, was danach kommt, vom System als eine einzelne Datei oder ein einzelnes Verzeichnis interpretiert wird.

Angenommen, ich möchte zum Beispiel ein Skript schreiben, das von bash ausgeführt werden soll im Posix-Modus. Die naive Art, das Shebang zu schreiben, wäre:

#!/usr/bin/env bash --posix

aber der Versuch, das resultierende Skript auszuführen, erzeugt den folgenden Fehler:

/usr/bin/env: ‘bash --posix’: No such file or directory

Ich kenne diesen Beitrag, aber ich habe mich gefragt, ob es eine allgemeinere und sauberere Lösung gibt.

BEARBEITEN :Ich weiß, dass es für Guile-Skripte einen Weg gibt, das zu erreichen, was ich will, dokumentiert in Abschnitt 4.3.4 des Handbuchs:

 #!/usr/bin/env sh
 exec guile -l fact -e '(@ (fac) main)' -s "$0" "[email protected]"
 !#

Der Trick dabei ist, dass die zweite Zeile (beginnend mit exec ) wird von sh als Code interpretiert aber im #!!# block, als Kommentar, und wird daher vom Guile-Interpreter ignoriert.

Wäre es nicht möglich, diese Methode auf jeden Interpreter zu verallgemeinern?

Zweite BEARBEITUNG :Nachdem ich ein wenig herumgespielt habe, scheint es das für Interpreter zu sein, die ihre Eingaben von stdin lesen können , würde die folgende Methode funktionieren:

#!/usr/bin/env sh
sed '1,2d' "$0" | bash --verbose --posix /dev/stdin; exit;

Es ist jedoch wahrscheinlich nicht optimal, da sh Prozess dauert, bis der Dolmetscher seine Arbeit beendet hat. Jedes Feedback oder jeder Vorschlag wäre willkommen.

Akzeptierte Antwort:

Es gibt keine allgemeine Lösung, zumindest nicht, wenn Sie Linux unterstützen müssen, da der Linux-Kernel alles nach dem ersten „Wort“ in der Shebang-Zeile als ein einziges Argument behandelt.

Ich bin mir nicht sicher, was die Einschränkungen von NixOS sind, aber normalerweise würde ich Ihren Shebang einfach schreiben als

#!/bin/bash --posix

oder, wo möglich, Optionen im Skript setzen:

set -o posix

Alternativ können Sie das Skript mit dem entsprechenden Shell-Aufruf selbst neu starten:

#!/bin/sh -

if [ "$1" != "--really" ]; then exec bash --posix -- "$0" --really "[email protected]"; fi

shift

# Processing continues

Dieser Ansatz kann auf andere Sprachen verallgemeinert werden, solange Sie einen Weg finden, die ersten paar Zeilen (die von der Shell interpretiert werden) von der Zielsprache zu ignorieren.

Verwandte:Wie fügt man mehrere Zeilen an eine Datei an?

GNU coreutilsenv bietet eine Problemumgehung seit Version 8.30, siehe die Antwort von unode für Details. (Dies ist in Debian 10 und höher, RHEL 8 und höher, Ubuntu 19.04 und höher usw. verfügbar.)


Linux
  1. So fügen Sie mehrere Hosts in phpMyAdmin hinzu

  2. So komprimieren Sie mehrere Dateien unter Linux

  3. Wie übergebe ich Parameter an einen Alias?

  4. Wie sende ich Stdout an mehrere Befehle?

  5. Mehrere Parameter über Xargs übergeben?

Bash Shebang

Dd:Mehrere Eingabedateien?

Mehrere glibc-Bibliotheken auf einem einzigen Host

Führen Sie mehrere Python-Skripte gleichzeitig aus

systemd - Gibt meinem Dienst mehrere Argumente

Shebang oder nicht Shebang