显然这同样适用于替换perl的python,bash,sh等等。
Quentin的答案显然是正确的,所以我接受了它,但我想我的意思是'使用#的两种方式的优点和缺点是什么!调用perl / python / bash作为脚本的解释器?'
答案 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脚本更好。