我应该将什么用于Perl脚本的shebang线?

时间:2010-05-07 22:07:22

标签: perl shebang

使用哪个更好或更快作为Perl脚本的shebang行?

#! perl

#! perl.exe

#! fullpath/perl(/perl.exe)

#! partialpath/perl(/perl.exe)

并且,当使用#!perl时,当它在特定系统上运行时,如何在脚本中找到我正在使用的perl解释器,以便将其放入shebang行?


而且,如果使用/path/path/perl*...是否允许用于文件夹?

8 个答案:

答案 0 :(得分:61)

如果您需要硬编码#!,请使用#!/usr/bin/env perl。为什么?你想要的是Perl程序与用户首选的Perl一起运行。这将是他们PATH中的第一个。 #!perl没有按照我的意思行事,它没有搜索用户的路径,#!/usr/bin/env perl就是你如何解决这个问题。 <{1}}将永远存在于Unix系统上。

如果用户正在使用Windows,正如其他人所指出的那样,这没关系。 Windows不使用#!它使用文件扩展名关联。确保您的程序被称为/usr/bin/env或其他什么,它会起作用。但包括#!无论如何,一些公用事业和编辑都会利用它。

如果您要发送代码,请让安装人员负责处理。 foo.plMakeMaker/Makefile.PL都会改变你的#!用于匹配用户用于安装的perl的行。他们会为你解决这个问题。

如果要为自己的生产用途安装代码,则应使用perl特定副本的完整路径。 perl的哪个副本?一个特定于您的项目。这是否意味着您需要为每个项目编译perl?不,你可以制作一个符号链接。 Project foo可能Module::Build/Build.PL指向/usr/local/bin/fooperl。使用/usr/bin/perl5.18。现在,如果您决定升级perl,则可以通过更改符号链接为每个项目执行此操作。

答案 1 :(得分:8)

Windows she-bang(从perl.exe位推断出来)似乎无关紧要,因为你的(咳)“shell”可能甚至不解析它(如果我错了,请纠正我,最近可能已经改变了)。

虽然(according to this thread),但仍可以通过Perl自己拾取一些命令行标志。

答案 2 :(得分:6)

  1. 正如ChristopheD指出的那样,我可以从实践中确认(XP上的ActivePerl),在Windows上不需要shebang线。

    一个shebang行告诉Unix shell哪个解释器将脚本传递给。

    在Windows上,传递脚本的程序将由基于扩展名的关联确定。

  2. 在Unix上,第三个选项(perl可执行文件的完整路径)最好。

    是的,您可以在理论上使用“..”(shell不关心)但您不应该使用相对路径 - 在执行脚本时您永远不知道当前工作目录是什么。

答案 3 :(得分:6)

如果您在Windows上通过Apache运行CGI,则使用SHEBANG。你需要perl的完整路径。

答案 4 :(得分:4)

如果您使用Perl在Unix上进行开发,并且使用“perlbrew”轻松地在不同版本的Perl之间切换,那么“!#/ usr / bin / env perl”shebang就行了。

答案 5 :(得分:2)

第一行代表shebang。它基本上告诉程序Perl解释器所在的位置,因为Perl是解释语言。在Linux上,您可以输入终端:

whereis perl

它将为您提供准确的位置。通常它位于 / usr / bin / perl 内。这意味着您希望将shebang与/ usr / bin / perl

相关联
#! /usr/bin/perl

use strict;
use warnings;
use v5.10.1;
.
.
.

这只是一些很好的做法,因此它显然是最快的解决方案。

我希望你觉得这很有用,

感谢。

答案 6 :(得分:1)

  

并且,当使用“#!perl”时,当它在特定系统上运行时,print()用于显示perl.exe的完整路径,可以包含在Shebang Line中吗?

好吧,如果您正在使用print语句,那么您已经在执行perl代码,所以......

答案 7 :(得分:0)

这是things which I dislike about Perl之一。

在Windows上,如果您至少使用ActiveState Perl,如果文件以.pl结尾,则Windows注册表将为您运行Perl解释器,而不管shebang行。在Cygwin上,我不确定为什么,#! perl也有效。在Unix上,您应该在shebang行中放置Perl可执行文件的完整路径。正如我在评论中指出的那样,Schwern's idea of using env很方便,但有一些危险。

这就是为什么我建议您最好的解决方案是将您的Perl脚本打包为CPAN模块。像Module :: Build这样的CPAN安装程序会将shebang行更改为Perl解释器的完整路径。 (我不确定Schwern的安装程序ExtUtils :: MakeMaker是否使用env,因为我不使用它。)