Es ist nicht unbedingt besser.
Der Vorteil #!/usr/bin/env pythonist, dass es die pythonausführbare Datei verwendet, die zuerst im Benutzer angezeigt wird $PATH.
Der Nachteil der #!/usr/bin/env pythonist , dass es , was auch immer verwendet pythonausführbar erscheint zuerst in dem Benutzer $PATH.
Das bedeutet, dass sich das Skript je nach Ausführung unterschiedlich verhalten kann. Für einen Benutzer wird möglicherweise das verwendet /usr/bin/python, das mit dem Betriebssystem installiert wurde. Zum anderen könnte ein Experiment verwendet werden /home/phred/bin/python, das nicht richtig funktioniert.
Und wenn pythones nur in installiert ist /usr/local/bin, kann ein Benutzer, der nicht /usr/local/binin installiert ist , $PATHdas Skript nicht einmal ausführen. (Das ist auf modernen Systemen wahrscheinlich nicht allzu wahrscheinlich, könnte aber für einen unklaren Interpreter leicht passieren.)
Indem #!/usr/bin/pythonSie angeben, geben Sie genau an, welcher Interpreter zum Ausführen des Skripts auf einem bestimmten System verwendet wird .
Ein weiteres mögliches Problem ist, dass Sie mit diesem #!/usr/bin/envTrick keine Argumente an den Intrepreter übergeben können (außer dem Namen des Skripts, der implizit übergeben wird). Dies ist normalerweise kein Problem, kann es aber sein. Viele Perl-Skripte werden mit geschrieben #!/usr/bin/perl -w, aber dies use warnings;ist heutzutage der empfohlene Ersatz. CSH-Skripte sollten verwendet werden #!/bin/csh -f- CSH-Skripte werden jedoch nicht empfohlen . Es könnte aber auch andere Beispiele geben.
Ich habe eine Reihe von Perl-Skripten in einem persönlichen Versionsverwaltungssystem, die ich installiere, wenn ich ein Konto auf einem neuen System einrichte. Ich verwende ein Installationsskript, das die #!Zeile jedes Skripts ändert, wenn es in my installiert wird $HOME/bin. (Ich musste nichts anderes als in #!/usr/bin/perlletzter Zeit verwenden. Es geht auf Zeiten zurück, in denen Perl oft nicht standardmäßig installiert war.)
Ein kleiner Punkt: Der #!/usr/bin/envTrick ist wohl ein Missbrauch des envBefehls, der ursprünglich (wie der Name schon sagt) dazu gedacht war, einen Befehl in einer veränderten Umgebung aufzurufen. Außerdem hatten einige ältere Systeme (einschließlich SunOS 4, wenn ich mich richtig erinnere) den envBefehl nicht in /usr/bin. Beides dürfte kein wesentliches Problem darstellen.  envfunktioniert auf diese Weise, viele Skripte verwenden diesen #!/usr/bin/envTrick, und Betriebssystemanbieter werden wahrscheinlich nichts tun, um ihn zu beschädigen. Es könnte ein Problem sein , wenn Sie ein Skript nur auf einem wirklich altes System zu laufen, aber dann sind Sie wahrscheinlich , es müssen sowieso ändern.
Ein weiteres mögliches Problem (dank Sopalajo de Arrierez für den Hinweis in den Kommentaren) ist, dass Cron-Jobs in einer eingeschränkten Umgebung ausgeführt werden. Insbesondere $PATHist in der Regel so etwas /usr/bin:/bin. Wenn sich das Verzeichnis mit dem Interpreter also nicht in einem dieser Verzeichnisse befindet, auch wenn es $PATHin einer Benutzer-Shell standardmäßig vorhanden /usr/bin/envist, funktioniert der Trick nicht. Sie können den genauen Pfad angeben oder Ihrer Crontab eine Linie hinzufügen, um sie festzulegen $PATH( man 5 crontabfür Details).