我应该用什么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.PL
和Module::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本身拾取( 根据这个线程 )。
-
正如ChristopheD指出的那样,我可以从实践中证实(XP上的ActivePerl),在Windows上,shebang行不是必须的。
一个shebang行告诉Unix shell将哪个解释器传递给脚本。
在Windows上,传递脚本的程序将由基于扩展名的关联来确定。
-
在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
,因为我不使用它。)