55

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

#! perl

#! perl.exe

#! fullpath/perl(/perl.exe)

#! partialpath/perl(/perl.exe)

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


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

4

8 回答 8

74

如果您必须硬编码 #!,请使用#!/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,您可以通过更改符号链接来为每个项目执行此操作。

于 2010-05-07T22:31:33.753 回答
8

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

于 2014-05-19T14:36:43.963 回答
8

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

不过,Perl 本身可能仍会拾取一些命令行标志(根据此线程)。

于 2010-05-07T22:09:41.930 回答
6
  1. 正如 ChristopheD 所指出的,我可以从实践中确认(XP 上的 ActivePerl)shebang 行在 Windows 上并不是真正需要的。

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

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

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

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

于 2010-05-07T22:15:15.133 回答
5

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

我最初将 shebang 行中的前 2 个字符颠倒了。刚刚修复/编辑。

于 2012-08-18T03:29:28.540 回答
4

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

whereis perl

这会给你它的确切位置。通常它在/usr/bin/perl里面。这意味着您要对 /usr/bin/perl 进行 shebang

#! /usr/bin/perl

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

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

希望这个对你有帮助,

谢谢。

于 2015-02-22T14:51:06.837 回答
1

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

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

于 2010-05-07T22:19:00.683 回答
0

这是我不喜欢 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,因为我不使用它。)

于 2010-05-08T02:13:35.900 回答