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

Shell-Skript funktioniert gut ohne Shebang-Zeile? Wieso den?

Der POSIX-Standard (Single UNIX Specification 4) ist nicht hilfreich:

Wenn die erste Zeile einer Datei mit Shell-Befehlen mit den Zeichen "#!" , die Ergebnisse sind nicht spezifiziert.

Der Standard impliziert also, dass, wenn Sie kein #! dann sollte es eine POSIX-Shell ausführen. Moderne Shells sind jedoch nicht POSIX-kompatibel. Die alte Korn Shell 88 (ksh88) führte die Bourne-Shell (ähnlich einer POSIX-Shell) ohne #! line, aber ksh93 bricht das, und Bash auch. Sowohl bei ksh93 als auch bei Bash führen sie ihre eigene Shell aus, wenn kein #! Leitung ist vorhanden.

Entgegen der landläufigen Meinung unterscheiden sich Bash- und Korn-Shells. Wenn Sie ein Shell-Skript schreiben, können Sie nie sicher sein, von welcher Shell Sie ausgeführt werden, oder ob es überhaupt von einer anderen Shell ausgeführt wird (die meisten Programmiersprachen können andere Programme ausführen). Sobald Sie etwas außerhalb der Bourne/POSIX-Syntax verwenden, werden Sie scupper.

Verwenden Sie immer ein #! Überlassen Sie es nicht dem Zufall.


Die übergeordnete Shell, in der Sie ./myscript.sh eingegeben haben , versuchte zuerst execve dort, wo die Shebang-Linie wirksam werden würde, falls vorhanden. Wenn dies funktioniert, ist sich der Elternteil des Unterschieds zwischen Skripten und ELFs nicht bewusst, da der Kernel sich darum kümmert.

Die execve schlug fehl, also wurde eine uralte Unix-Kompatibilitätsfunktion aktiviert, die vor der Existenz von Shebang-Zeilen existierte. Es wurde vermutet, dass eine Datei, die eine Ausführungsberechtigung hat, aber vom Kernel nicht als gültige ausführbare Datei erkannt wird, ein Shell-Skript sein muss.

Normalerweise vermutet die übergeordnete Shell, dass das Skript für dieselbe Shell geschrieben wurde (minimale Bourne-ähnliche Shells führen das Skript mit /bin/sh aus , bash führt es als Bash-Unterprozess aus), csh führt basierend auf dem ersten Zeichen etwas kompliziertere Vermutungen durch, weil es auch älter als Shebang ist und mit der Bourne-Shell koexistieren musste).

Sie brauchen eine Shebang-Linie, wenn Sie wissen, dass diese Vermutungen falsch sind (zum Beispiel mit dem Shebang ist #!/usr/bin/perl ), oder wenn Sie nicht darauf vertrauen, dass das Raten konsistent funktioniert, oder wenn das Skript von einem übergeordneten Prozess ausgeführt werden muss, der selbst keine Shell ist.


Shebang-Linie wird in benötigt die Datei und nur dann, wenn sie als ausführbar ausgeführt werden soll (im Gegensatz zu sh file.sh Aufruf. Es wird nicht wirklich vom Skript benötigt, es ist für das System, um zu wissen, wie es den Interpreter findet.

BEARBEITEN :Tut mir leid, dass ich die Frage falsch gelesen habe. Wenn die Shebang-Zeile fehlt oder nicht erkannt wird, /bin/sh wird genutzt. Aber ich ziehe es vor, explizit über den Dolmetscher zu sprechen.

Beachten Sie, dass dieses Verhalten nicht universell ist, IIRC, nur einige exec* Familienfunktion tun dies (ganz zu schweigen von verschiedenen Plattformen), also ist dies ein weiterer Grund, hier explizit zu sein.


Linux
  1. Aktuelles Verzeichnis des Shell-Skripts?

  2. Ubuntu Python Shebang-Zeile funktioniert nicht

  3. Berechnung des gerundeten Prozentsatzes in Shell Script ohne Verwendung von bc

  4. So führen Sie eine Datei ohne die Erweiterung .sh in der Shell aus

  5. Beenden Sie das Programm, nachdem es eine bestimmte Zeile aus einem Shell-Skript ausgegeben hat

Welcher Shell-Interpreter führt ein Skript ohne Shebang aus?

Zeitüberschreitung in einem Shell-Skript?

Warum führt „sudo Su“ in einem Shell-Skript den Rest des Skripts nicht als Root aus?

Was ist Shebang in Linux Shell Scripting?

Zeile mit Shell-Skript an die Datei /etc/hosts anhängen

Wie füge ich eine neue Zeile in ein Linux-Shell-Skript ein?