Ich weiß nicht, ob dies der Anwendungsfall ist, an den Sie denken, aber eine Sache, die Sie tun können , ist
#!/usr/bin/env python
so dass Ihr Skript verwendet die erste pythonin $PATHanstatt zu hart Code benötigen /usr/bin/python, die nicht gut auf irgendeinem System funktionieren könnten , wo die „gute“ Version von Python in ist /usr/local/binoder /optoder was auch immer.
Warum ist es besser, "#! / Usr / bin / env NAME" anstelle von "#! / Path / to / NAME" als Shebang zu verwenden?
Dadurch wird keine Endlosschleife erstellt, da der Python-Interpreter (der envdie Datei aufruft) die #!Zeile nur als Kommentar behandelt. Dies ist eine Art Punkt des #!Entwurfs, da viele Sprachen #als Kommentarzeichen verwendet werden.
Um dies zu erweitern, können Sie ein Polyglot-Programm schreiben, das zunächst unter ausgeführt #!/bin/shwird, dann aber herausfindet, welcher Interpreter tatsächlich verwendet werden soll, und dieses im selben Skript aufruft.
Es stellt sich heraus, dass es bereits eine Webseite mit mehrzeiligen Shebang-Tricks für viele Sprachen gibt, auch für kompilierte Sprachen (das Skript gibt einen Teil von sich an einen Compiler weiter und führt die Ausgabe aus).
Die perlrunManpage gibt dieses Beispiel als Alternative zu #!/usr/bin/env perl:
#!/bin/sh
#! -*-perl-*-
eval 'exec perl -x -wS $0 ${1+"$@"}'
if 0;
your perl script goes here
Wenn es als /bin/shSkript ausgeführt wird, wird es evalin perl -x -wSIhrem Skript ausgeführt und gibt Ihre Argumente weiter.
Wenn Perl es ausführt, evalwird das von der if 0;in der nächsten Zeile gesteuert , so dass es nie ausgeführt wird. Im Gegensatz dazu shwerden Perl-Anweisungen nicht durch einen Zeilenumbruch beendet.
Sie können dies komplexer gestalten, indem Sie "$SHEBANG"anstelle von perloder sogar mehrere shBefehle ausführen, um einen zu verwendenden Perl-Interpreter auszuwählen.