使用哪个更好或更快作为Perl脚本的shebang行?
#! perl
#! perl.exe
#! fullpath/perl(/perl.exe)
#! partialpath/perl(/perl.exe)
并且,当使用#!perl
时,当它在特定系统上运行时,如何在脚本中找到我正在使用的perl解释器,以便将其放入shebang行?
而且,如果使用/path/path/perl
,*
或...
是否允许用于文件夹?
答案 0 :(得分:61)
如果您需要硬编码#!,请使用#!/usr/bin/env perl
。为什么?你想要的是Perl程序与用户首选的Perl一起运行。这将是他们PATH
中的第一个。 #!perl
没有按照我的意思行事,它没有搜索用户的路径,#!/usr/bin/env perl
就是你如何解决这个问题。 <{1}}将永远存在于Unix系统上。
如果用户正在使用Windows,正如其他人所指出的那样,这没关系。 Windows不使用#!它使用文件扩展名关联。确保您的程序被称为/usr/bin/env
或其他什么,它会起作用。但包括#!无论如何,一些公用事业和编辑都会利用它。
如果您要发送代码,请让安装人员负责处理。 foo.pl
和MakeMaker/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)
正如ChristopheD指出的那样,我可以从实践中确认(XP上的ActivePerl),在Windows上不需要shebang线。
一个shebang行告诉Unix shell哪个解释器将脚本传递给。
在Windows上,传递脚本的程序将由基于扩展名的关联确定。
在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
,因为我不使用它。)