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

Shebang-Zeile mit `#!/usr/bin/env command --argument` schlägt unter Linux fehl

Sieht so aus, weil Linux (im Gegensatz zu BSD) nur ein einziges Argument an den shebang-Befehl übergibt (in diesem Fall env).

Dies wurde ausführlich auf StackOverflow diskutiert.


Gefunden über den @rampion-Kommentar:

Was passiert ist, dass der Kernel die ersten beiden Zeichen der Datei verarbeitet und nach #! sucht. Wenn diese gefunden werden, überspringt es alle Leerzeichen und sucht nach einem Nicht-Leerzeichen und extrahiert den Interpreter-Pfad, der eine echte ausführbare Datei und kein anderes Skript sein muss, obwohl Linux diesen erweitert, um eine rekursive Skriptverarbeitung zu ermöglichen. Nachdem es das gefunden hat, springt es zum ersten Nicht-Leerzeichen, wo es von dort zum nächsten Zeilenumbruchzeichen geht und dieses als einzelnes Argument an den Befehl weitergibt. Es gibt keine Shell-Verarbeitung von Anführungszeichen oder anderen Metazeichen. Es ist alles sehr einfach und rohe Gewalt. Daher kann man sich dort nicht mit Optionen austoben. Man bekommt genau ein Argument mit Leerzeichen und 'perl -w' ist das, was der Kernel hier sieht und weitergibt.

Quelle:http://lists.gnu.org/archive/html/bug-sh-utils/2002-04/msg00020.html


Linux
  1. Was ist die Verwendung des Befehls ‘/usr/bin/[‘ [eckige Klammer] in Linux?

  2. Wie behandelt Linux mehrere aufeinanderfolgende Pfadtrennzeichen (/home////username///file)?

  3. Wechseln Sie das Verzeichnis und führen Sie die Datei in einem Befehl aus

  4. Was ist der Unterschied zwischen #!/usr/bin/env bash und #!/usr/bin/bash?

  5. cmake --version zeigt auf /usr/bin/cmake, während cmake auf /usr/local/bin zeigt

Diff-Befehl in Linux mit Beispielen

Linux-Cut-Befehl mit praktischen Beispielen

So überprüfen Sie die Betriebssystemversion mit der Linux-Befehlszeile

Linux – /sbin/init existiert nicht?

Uniq-Befehl in Linux mit Beispielen erklärt

Verwendung des Linux-Befehls sed mit Beispielen