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

哪一个更好或更快地用作Perl脚本的shebang行?

#! perl #! perl.exe #! fullpath/perl(/perl.exe) #! partialpath/perl(/perl.exe) 

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


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

如果你必须硬编码#!,请使用#!/usr/bin/env perl 。 为什么? 你想要的是Perl程序与用户首选的Perl一起运行。 这将是他们PATH的第一个。 #!perl并没有做我的意思,它不search用户的PATH, #!/usr/bin/env perl就是你如何解决这个问题。 /usr/bin/env将永远在Unix系统上。

如果用户使用Windows,正如其他人指出的那样,这并不重要。 Windows不使用#! 它使用文件扩展名关联。 确保你的程序被称为foo.pl什么的,它会工作。 但包括#! 无论如何,因为一些公用事业和编辑使用它。

如果您正在发送代码,请让安装者处理。 MakeMaker/Makefile.PLModule::Build/Build.PL都会改变你的#! 行来匹配用户用来安装的perl。 他们会为你照顾这个问题。

如果您正在为自己的生产使用安装代码,则应该使用perl的特定副本的完整path。 哪个副本的Perl? 一个特定于您的项目。 这是否意味着您需要为每个项目编译perl? 不,你可以做一个符号链接。 foo项目可能在/usr/bin/perl5.18/usr/local/bin/fooperl 。 使用#!/usr/local/bin/fooperl 。 现在,如果您决定升级perl,则可以通过更改符号链接来执行每个项目。

一个Windows(从perl.exe位扣除)似乎是无关紧要的,因为你的(shell)可能不会parsing它(纠正我,如果我错了,最近可能已经改变了)。

一些命令行标志仍然可以被Perl本身拾取( 根据这个线程 )。

  1. 正如ChristopheD指出的那样,我可以从实践中证实(XP上的ActivePerl),在Windows上,shebang行不是必须的。

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

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

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

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

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

如果你使用Perl开发Unix系统,并使用“perlbrew”来轻松切换不同版本的Perl,那么“!#/ usr / bin / env perl”shebang就行。

第一行代表shebang。 它基本上告诉Perl解释器所在的程序,因为Perl是解释语言。 在Linux上你可以inputterminal:

 whereis perl 

这会给你确切的位置。 通常在/ usr / bin / perl中 。 这意味着你想对/ usr / bin / perl进行shebang

 #! /usr/bin/perl use strict; use warnings; use v5.10.1; . . . 

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

希望这个对你有帮助,

谢谢。

而且,当使用“#!perl”,当它在一个特定的系统上工作时,什么是print()来显示perl.exe的完整path,可以包含在Shebang Line中?

那么,如果你正在使用打印语句,你已经在执行Perl代码,所以…

这是我不喜欢Perl的东西之一。

在Windows上,如果至less使用ActiveState Perl,如果文件以.pl结尾,则Windowsregistry将为您运行Perl解释器,而不pipeshebang行如何。 在Cygwin,我不知道为什么,但#! perl #! perl可以工作。 在Unix上,你应该把你的Perl可执行文件的完整path放在shebang行。 Schwern使用env的想法很方便,但有一些危险,正如我在评论中指出的那样。

这就是为什么我build议你最好的解决scheme是将你的Perl脚本打包为CPAN模块 。 CPAN安装程序,如Module :: Build,然后将shebang行更改为您的Perl解释器的完整path。 (我不确定Schwern的安装程序ExtUtils :: MakeMaker是做这个还是使用env ,因为我不使用它。)