不一定更好。
这样做的好处#!/usr/bin/env python是,它将使用python用户的中第一个出现的可执行文件$PATH。
该不利的#!/usr/bin/env python是,它会使用任何python可执行文件第一次出现在用户的$PATH。
这意味着脚本的行为可能取决于运行它的人。对于一个用户,它可能会使用/usr/bin/python与操作系统一起安装的。另外,它可能会使用/home/phred/bin/python无法完全正常运行的实验。
如果python仅安装在/usr/local/bin,谁没有一个用户/usr/local/bin在$PATH甚至不能够运行该脚本。(这在现代系统上可能不太可能,但是对于比较晦涩的解释器来说,很容易发生。)
通过指定,#!/usr/bin/python您可以确切指定将使用哪个解释程序在特定系统上运行脚本。
另一个潜在的问题是该#!/usr/bin/env技巧不允许您将参数传递给解释器(脚本名称除外,该名称是隐式传递的)。这通常不是问题,但是可以。许多Perl脚本都是用编写的#!/usr/bin/perl -w,但如今use warnings;建议将其替换。Csh脚本应使用#!/bin/csh -f-但首先不建议使用csh脚本。但是可能还有其他例子。
在新系统上设置帐户时,我在安装的个人源代码控制系统中有许多Perl脚本。我使用安装程序脚本来修改#!每个脚本的行,因为该脚本会将其安装到我的计算机中$HOME/bin。(除了#!/usr/bin/perl最近我不需要使用其他任何东西;这可以追溯到默认情况下通常不安装Perl的时代。)
一点要点:#!/usr/bin/env窍门可以说是对env命令的滥用,其最初意图(顾名思义)是在环境改变的情况下调用命令。此外,某些较旧的系统(如果我没记错的话,包括SunOS 4)在中没有env命令/usr/bin。这些都不大可能成为重大问题。 env确实以这种方式工作,许多脚本确实使用了该#!/usr/bin/env技巧,并且操作系统提供者不太可能做任何破坏它的事情。它可能如果你希望你的脚本一个很老的系统上运行,但随后你可能总有需要修改它是一个问题。
另一个可能的问题(由于Sopalajo de Arrierez在评论中指出了这一点)是cron作业在受限的环境中运行。特别是,$PATH通常是类似的东西/usr/bin:/bin。因此,即使包含解释器的目录恰好不在这些目录之一中,即使该目录$PATH位于用户外壳程序的默认目录中,该/usr/bin/env技巧也无法奏效。您可以指定确切的路径,也可以在crontab中添加一行以进行设置$PATH(man 5 crontab有关详细信息)。