【问题标题】:What should I use for a Perl script's shebang line?Perl 脚本的 shebang 行应该使用什么?
【发布时间】:2015-12-16 07:40:24
【问题描述】:

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

#! perl

#! perl.exe

#! fullpath/perl(/perl.exe)

#! partialpath/perl(/perl.exe)

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


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

【问题讨论】:

  • 回答第二个问题,print $^X 显示了活动 perl 可执行文件的路径。
  • 在 MacOS X(我认为大多数 Unix 版本)上,#!perl 根本不起作用。它需要一个完整的路径。

标签: perl shebang


【解决方案1】:

如果您必须硬编码 #!,请使用 #!/usr/bin/env perl。为什么?您想要的是 Perl 程序与用户首选的 Perl 一起运行。这将是他们PATH 中的第一个。 #!perl 不符合我的意思,它不搜索用户的路径,#!/usr/bin/env perl 是你实现它的方式。 /usr/bin/env 将永远存在于 Unix 系统上。

如果用户使用的是 Windows,正如其他人所指出的,那没关系。 Windows 不使用 #!它使用文件扩展名关联。确保您的程序被称为foo.pl 或其他名称,它会工作。但包括 #!无论如何,因为一些实用程序和编辑器会使用它。

如果您要发送代码,请让安装程序处理它。 MakeMaker/Makefile.PLModule::Build/Build.PL 都会改变你的 #!与用户安装时使用的 perl 相匹配的行。他们会为您解决这个问题。

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

【讨论】:

  • 在 Unix 上,如果计算机上有多个版本的 Perl,#!/usr/bin/env perl 可能会导致问题。例如,用户帐户将PATH 设置为在/usr/bin/perl 之前有另一个Perl。用户以“root”身份登录。然后,当 root 尝试运行系统脚本时,它实际上运行的是非系统 perl。所以系统脚本不应该使用这个。
  • 原因 #19382 永远不要以 root 身份登录。使用sudo。 ;)
  • @Schwern - 你忘了一件事 - 并非所有用户首选的 perl 二进制文件都被命名为 perl :( [我们的是 perl5.8]
  • @DVK 你说得对,有一些小的不兼容性,我们可以整天挑它们。现在,哪个更好:在你的路径中没有任何称为“perl”的东西,也没有机会运行寻找“perl”的脚本,并且在你的路径中有一个叫做“perl”的东西(你不需要成为root用户)路径中的 perl 符号链接)并且有很好的机会?
  • @Jim2B 是的,几乎所有 Unix 将perl 放入/usr/bin/usr/bin/env 不是目录,而是程序。 #!/usr/bin/env interpreter 是一种无需使用硬编码路径即可启动解释器的常用方法。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    虽然 (according to this thread),Perl 本身可能仍会获取一些命令行标志。

    【讨论】:

      【解决方案4】:
      1. 正如 ChristopheD 所指出的,我可以通过实践(XP 上的 ActivePerl)确认 shebang 行在 Windows 上并不是真正需要的。

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

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

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

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

        • 您在上面的!#/usr/bin/env 中有!#。 Shebang 行总是以#! 开头,因为# 是shell 的注释行。
        • 我刚刚发现你不能像这样在 perl 中使用参数。 IE。有人想在他们的污点上加上 -T -w ,但这不适用于 /usr/bin/env...烦人。
        【解决方案6】:

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

        whereis perl
        

        这将为您提供它的确切位置。通常它在 /usr/bin/perl 中。这意味着您要对 /usr/bin/perl 进行 shebang

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

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

        我希望你觉得这很有用,

        谢谢。

        【讨论】:

        • 如果你把你的脚本交给在 /usr/share/bin/perl 中有 perl 的人?...
        • 如何硬编码解释器的路径?
        【解决方案7】:

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

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

        【讨论】:

          【解决方案8】:

          这是things which I dislike about Perl 之一。

          在 Windows 上,如果您至少使用 ActiveState Perl,如果文件以 .pl 结尾,那么 Windows 注册表将为您运行 Perl 解释器,而不考虑 shebang 行。在 Cygwin 上,我不知道为什么,但 #! perl 也可以。在 Unix 上,您应该将 Perl 可执行文件的完整路径放在 shebang 行中。 Schwern's idea of using env 很方便,但有一些危险,正如我在评论中指出的那样。

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

          【讨论】:

          • 模块::构建#!修复代码来自 MakeMaker,它来自粉红色的 Camel 书。他们都对 perl 的路径进行了硬编码。
          • 是的,我在 spamassassin 中注意到了这一点,他们的第一行显示:“#!/home/perl/perl-5.28.1/bin/perl -T -w。我在 /usr/ 有一个符号链接bin/perl 指向我的 perl 安装。我使用它来获得使用 perl 的版本非特定路径,并且当我想测试不同的版本时,我将要测试的 perl 的 bin 目录添加到前面我的路径。适用于不硬编码路径的东西。
          • 另外,这意味着如果我升级我的 perl,一堆脚本将停止工作——我可以通过 CPAN 理解和更新的二进制文件,但是 perl 的大部分是独立于架构的,至少 perl声称在主要版本 (5.28.{0,1,2,3...}用于不同版本 progs 的库,甚至 Unix 也使用版本化解决了它,例如 perl-5.6.6.so 和 perl-5.16.3.so 都可以在 lib 和 progs 链接到 5.6 或 5.16,具体取决于需要
          猜你喜欢
          • 2011-10-17
          • 2014-09-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多