不一定更好。
这样做的好处#!/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
有关详细信息)。