编写脚本时,#!/ usr/bin/perl和#!/ usr/bin/env perl之间的区别是什么?

Joh*_*den 8 shell perl shebang

显然,这同样适用于替换perl的python,bash,sh等!

昆汀在下面的答案显然是正确的,所以我接受了它,但我想我的意思是'两种使用方式的优缺点是什么#!调用perl/python/bash作为脚本的解释器?'

Que*_*tin 9

一个引用了perl安装的常见位置.另一个引用了env安装的常见位置,并询问默认perl的路径是什么.


dax*_*xim 7

这些是很好的规则,如果你有充分的理由打破它们,请不要犹豫:

#!/usr/bin/env perl尽可能使用异构系统之间的可移植性.但这是一种愚蠢的方式,因为它假设路径中第一个Perl也是你一直想要的Perl.可能不是这样,通常当系统上存在多个Perls时,由于某种原因它们就在那里.

更好的方法是在支持CPAN的发行版中打包脚本.分发发行版到要安装它们,并以通常的方式(手动或使用CPAN工具链)安装这些系统,specifiying的完整路径perlcpan.在此过程中,shebang行被重写为Perl的正确路径.

例子:

tar -xvf Local-OurCompany-Scripts-1.000.tar.gz
cd Local-OurCompany-Scripts-1.000

## automated installation
/usr/bin/cpan .
# or perhaps
/opt/ourcompany/perls/perl-5.14.2/bin/cpan .

## manual installation
/usr/bin/perl Makefile.PL ; make ; make install
# or perhaps
`which perl5.14.2` Makefile.PL ; make ; make install
Run Code Online (Sandbox Code Playgroud)

  • 但是你忘记了操作路径很容易 - 使用`env`允许你为不同的程序使用不同的perls(甚至在不同的时间使用相同的程序).使用硬编码的perl路径和CPAN的路径重写功能假设用于安装的perl是你总是想要的perl,我认为这是一个比`env`更大(和更糟)的假设,因为它需要修改源来覆盖它,而不是简单的"PATH =/path/to/other/perl:$ PATH some_perl.pl". (2认同)

oyl*_*gul 5

使用env查找可执行文件,而不是自己查找它,会执行额外的 exec,但这在大多数情况下并不重要。很方便,我自己也经常用。

env但是,我在系统脚本中使用的人遇到了问题。有一次,安装一个/usr/local/bin/perl版本破坏了我的系统,因此在解决问题之前我无法再更新它。还有一次,安装/usr/local/bin/python破坏了我正在使用的 ID3 标记器。我认为这更多的是一个包装问题,而不是env. 如果你要在系统上安装某些东西,如果你每次都留下一条 shebang 行来寻找任何旧版本的 Python,为什么要仔细检查它是否有一个满足你所有依赖项的 Python 版本呢?它是运行吗?