其中哪一个更好或更快地用作 Perl 脚本的 shebang 行?
#! perl
#! perl.exe
#! fullpath/perl(/perl.exe)
#! partialpath/perl(/perl.exe)
而且,当使用#!perl
时,当它在特定系统上运行时,我如何在脚本中找出我正在使用的 perl 解释器,以便我可以将它放入 shebang 行?
并且,如果使用/path/path/perl
, 是否*
或...
允许用于文件夹?
如果您必须硬编码 #!,请使用#!/usr/bin/env perl
. 为什么?您想要的是 Perl 程序与用户首选的 Perl 一起运行。这将是他们的第一个PATH
。 #!perl
不符合我的意思,它不搜索用户的 PATH,#!/usr/bin/env perl
这就是你实现它的方式。 /usr/bin/env
将永远存在于 Unix 系统上。
正如其他人指出的那样,如果用户使用的是 Windows,那没关系。Windows 不使用 #! 它使用文件扩展名关联。确保您的程序被调用foo.pl
或其他东西,它会工作。但包括 #! 无论如何,因为一些实用程序和编辑器会使用它。
如果您要发送代码,请让安装程序处理它。两者MakeMaker/Makefile.PL
都会Module::Build/Build.PL
改变你的 #! 与用户安装时使用的 perl 相匹配的行。他们会为你解决这个问题。
如果您为自己的生产用途安装代码,则应使用 perl 特定副本的完整路径。perl的哪个副本?一个特定于您的项目。这是否意味着您需要为每个项目编译 perl?不,您可以创建符号链接。项目 foo 可能/usr/local/bin/fooperl
指向/usr/bin/perl5.18
. 使用#!/usr/local/bin/fooperl
. 现在,如果您决定升级 perl,您可以通过更改符号链接来为每个项目执行此操作。
如果您在 Windows 上通过 Apache 运行 CGI,则使用 SHEBANG。您将需要 perl 的完整路径。
Windows she-bang(从perl.exe
位推断)似乎无关紧要,因为您的(咳咳)“外壳”可能甚至不解析它(如果我错了,请纠正我,最近可能已经更改)。
不过,Perl 本身可能仍会拾取一些命令行标志(根据此线程)。
正如 ChristopheD 所指出的,我可以从实践中确认(XP 上的 ActivePerl)shebang 行在 Windows 上并不是真正需要的。
shebang 行告诉 Unix shell 将脚本传递给哪个解释器。
在 Windows 上,将脚本传递给的程序将由基于扩展名的关联确定。
在 Unix 上,第三个选项(perl
可执行文件的完整路径)是最好的。
是的,理论上你可以使用“..”(shell 不在乎),但你不应该真正使用相对路径——你永远不知道执行脚本时当前的工作目录是什么。
如果您在 Unix 中使用 Perl 进行开发,并且您使用“perlbrew”在不同版本的 Perl 之间轻松切换,那么“#!/usr/bin/env perl”shebang 行很有效。
我最初将 shebang 行中的前 2 个字符颠倒了。刚刚修复/编辑。
第一行代表shebang。它基本上告诉程序 Perl 解释器所在的位置,因为 Perl 是解释性语言。在 Linux 上,您可以输入终端:
whereis perl
这会给你它的确切位置。通常它在/usr/bin/perl里面。这意味着您要对 /usr/bin/perl 进行 shebang
#! /usr/bin/perl
use strict;
use warnings;
use v5.10.1;
.
.
.
这只是一些好的做法,因此它显然是最快的解决方案。
希望这个对你有帮助,
谢谢。
而且,当使用“#!perl”时,当它在特定系统上运行时,用于显示 perl.exe 的完整路径的 print() 是什么,可以包含在 Shebang Line 中?
好吧,如果您正在使用 print 语句,那么您已经在执行 perl 代码,所以...
这是我不喜欢 Perl的地方之一。
在 Windows 上,如果您至少使用 ActiveState Perl,如果文件以 .pl 结尾,那么无论 shebang 行如何,Windows 注册表都会为您运行 Perl 解释器。在 Cygwin 上,我不知道为什么,但#! perl
也可以。在 Unix 上,您应该将 Perl 可执行文件的完整路径放在 shebang 行中。正如我在评论中指出的那样,Schwern 的使用想法很方便,但也有一些危险。env
这就是为什么我向您建议最好的解决方案是将您的 Perl 脚本打包为 CPAN 模块的原因。然后像 Module::Build 这样的 CPAN 安装程序会将 shebang 行更改为 Perl 解释器的完整路径。(我不确定 Schwern 的安装程序 ExtUtils::MakeMaker 是这样做还是使用env
,因为我不使用它。)