2011-09-30 59 views
8

很明显,这适用于python,bash,sh等替代perl!脚本编写时,#!/ usr/bin/perl和#!/ usr/bin/env perl有什么区别?

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

+0

这个问题并没有真正有什么具体的脚本语言,但我把它标记perl的,因为这是在标题中使用的示例。 – agf

回答

9

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

3

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

但是,我在使用env的系统脚本中遇到过问题。 On one occasion,安装了一个/usr/local/bin/perl打破了我的系统,所以我无法更新它,直到我解决了问题。 On another occasion,安装了一个/usr/local/bin/python打破了我使用的ID3标记器。我认为这更像是一个包装问题,而不是env的固有问题。如果你在系统上安装某些东西,为什么你要仔细检查它是否有满足你所有依赖关系的Python版本,如果你只是想留下一条每次都会为任何旧版本的Python而存活的shebang行它运行?

+0

我看不出为什么'env'应该分叉另一个进程。你的意思是“高管”,还是你想介绍这个主题? –

+0

是的。发布更新。谢谢! – oylenshpeegul

1

我可以给你一个具体的例子:

想象一下,你必须安装在/ opt /(即XAMPP)灯封装,包括它自己的Perl的可执行文件,库和PAKAGE经理。

实际上,您希望运行该可执行文件,以便将路径添加到PATH环境变量(PATH =“/ opt/XAMPP/bin:$ PATH”)中的LAMP可执行文件。

现在任何使用“#!/ usr/bin/env perl”的脚本都将执行LAMP堆栈目录中的perl二进制文件。其他路径将在“/ usr/bin/perl”中执行系统中预安装的perl二进制文件。

这取决于你决定什么是更好的Perl脚本。

7

这些都是很好的规则,如果你有一个很好的理由来打破他们,不要犹豫,这样做的:

使用#!/usr/bin/env perl其中可能异构系统之间的可移植性。但这是一种愚蠢的做法,因为它假设路径中第一个Perl也是您始终想要的Perl。这可能不是这样,并且通常当系统上有多个Perls时,他们出于某种原因。

更好的方法是将脚本打包到CPAN就绪的发行版中。将发行版分发到您希望安装它们的系统,并以通常方式(手动或使用CPAN工具链)安装它们,指定完整路径perlcpan。在那个过程中,the shebang line is rewritten去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 
+2

但是你忘记了操纵路径很容易完成 - 使用'env'可以让你为不同的程序使用不同的perls(甚至在不同的时间使用同一个程序)。使用硬编码的perl路径和CPAN的路径重写功能使得perl用于安装的假设是您始终需要的perl,我认为这是一个比'env'更大(更糟糕)的假设,因为它需要修改源代码来覆盖它,而不是简单的“PATH =/path/to/other/perl:$ PATH some_perl.pl”。 –

+0

我同意这部分:_“但这是一种愚蠢的做法,因为它会假设路径中第一个Perl也是您始终想要的Perl。”并且会补充说它假定您的脚本将会对任何给定的Perl(和Per​​l-Modules)实例都能正常工作。 – Gonen

相关问题