Es ist nicht unbedingt besser.
Der Vorteil #!/usr/bin/env python
ist, dass es die python
ausführbare Datei verwendet, die zuerst im Benutzer angezeigt wird $PATH
.
Der Nachteil der #!/usr/bin/env python
ist , dass es , was auch immer verwendet python
ausfü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 python
es nur in installiert ist /usr/local/bin
, kann ein Benutzer, der nicht /usr/local/bin
in installiert ist , $PATH
das 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/python
Sie 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/env
Trick 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/perl
letzter Zeit verwenden. Es geht auf Zeiten zurück, in denen Perl oft nicht standardmäßig installiert war.)
Ein kleiner Punkt: Der #!/usr/bin/env
Trick ist wohl ein Missbrauch des env
Befehls, 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 env
Befehl nicht in /usr/bin
. Beides dürfte kein wesentliches Problem darstellen. env
funktioniert auf diese Weise, viele Skripte verwenden diesen #!/usr/bin/env
Trick, 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 $PATH
ist 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 $PATH
in einer Benutzer-Shell standardmäßig vorhanden /usr/bin/env
ist, funktioniert der Trick nicht. Sie können den genauen Pfad angeben oder Ihrer Crontab eine Linie hinzufügen, um sie festzulegen $PATH
( man 5 crontab
für Details).