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 python
in $PATH
anstatt 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/bin
oder /opt
oder 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 env
die 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/sh
wird, 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 perlrun
Manpage 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/sh
Skript ausgeführt wird, wird es eval
in perl -x -wS
Ihrem Skript ausgeführt und gibt Ihre Argumente weiter.
Wenn Perl es ausführt, eval
wird das von der if 0;
in der nächsten Zeile gesteuert , so dass es nie ausgeführt wird. Im Gegensatz dazu sh
werden Perl-Anweisungen nicht durch einen Zeilenumbruch beendet.
Sie können dies komplexer gestalten, indem Sie "$SHEBANG"
anstelle von perl
oder sogar mehrere sh
Befehle ausführen, um einen zu verwendenden Perl-Interpreter auszuwählen.