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

时间:2011-09-30 10:06:25

标签: perl shell shebang

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

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

4 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:7)

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

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

更好的方法是在支持CPAN的发行版中打包脚本。将发行版分发到要安装它们的系统,并以常规方式(手动或使用CPAN工具链)安装它们,指定完整路径perl或{{1 }}。在此过程中,the shebang line is rewritten指向Perl的正确路径。

示例:

cpan

答案 2 :(得分:3)

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

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

答案 3 :(得分:1)

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

想象一下,你在/ opt /(即XAMPP)中安装了一个LAMP包,其中包含了自己的perl可执行文件,库和pakage manager。

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

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

由您决定什么对您的perl脚本更好。