【问题标题】:How can I ensure my program finds the perl interpreter on different platforms?如何确保我的程序在不同平台上找到 perl 解释器?
【发布时间】:2009-11-03 04:07:25
【问题描述】:

我的 Perl 脚本在多个操作系统下运行,包括 unix 和 Win32。在每个操作系统上都有独特的 Perl 设置,其中 perl 解释器位于不同的目录下。

有没有办法在 shebang 行上指定解释器,例如:

#!which perl

【问题讨论】:

    标签: perl


    【解决方案1】:

    使用普通的 CPAN 工具安装您的脚本。在构建过程中,他们将您用于运行构建脚本的 perl 插入到 shebang 行中。此外,您将确保您使用的 perl 已安装依赖项。

    例如,您的脚本顶部有:

    #!perl

    使用正常的模块分发流程(以我的App::PPI::Dumper为例),

    $ perl5.10.0 Makefile.PL

    安装它,ExtUtils::Makemaker 或 Module::Build 用你在构建脚本中使用的 perl 的路径重写 shebang:

     #!/usr/local/perls/perl-5.10.0-rc2/bin/perl
    
     eval 'exec /usr/local/perls/perl-5.10.0-rc2/bin/perl  -S $0 ${1+"$@"}'
         if 0; # not running under some shell
    

    当您将脚本作为一个完整的发行版分发时,您将免费获得所有工具链功能,例如自动安装依赖项。它让生活更轻松。

    【讨论】:

      【解决方案2】:

      在某些 unix 上(可能是 Cygwin 和 MinGW/Msys 之类的),您可以使用 env 在 PATH 上搜索 perl,如下所示:

      #!/usr/bin/env perl
      

      【讨论】:

      • 这会找到一个 perl,但可能不是你想要的。如果你想要一个特定的,这不是指定它的方法。
      【解决方案3】:

      使用的一个技巧是有一条线

       #!/usr/bin/env perl
      

      无论它位于何处,它都会为您运行 Perl。

      但是...... 你应该注意,如果你的系统上有多个 Perl 解释器,这可能会导致问题。例如我使用 Ubuntu linux,而 Perl 是系统的一个组件。但是 Ubuntu 系统 Perl 解释器状态不佳,由于 Debian 人员的一些可疑设置决定,因此安装 CPAN 模块之类的东西很棘手。因此,我总是在我的用户空间中使用我自己编译的 perl 来完成我自己的工作。一些 Ubuntu Perl 脚本使用上述形式,因此如果我碰巧从命令行运行它们会中断,因为我的 perl 解释器在 Ubuntu 默认 Perl 的路径中领先。

      【讨论】:

      • 这会找到一个 perl,但可能不是你想要的。如果你想要一个特定的,这不是指定它的方法。
      • 我知道。但它会给你与which perl 相同的结果,这就是问题所要求的。
      • 我对我的所有脚本都这样做(使用 Perl 脚本),我发现它是最好的解决方案。但是当我在 Windows 上时,我通常在 Cygwin 下运行它们。
      • 我认为值得指出一些问题。
      • 您还需要注意,这是依赖于 PATH 的,因此您需要确保正确的 PATH 出现在任何地方,适用于所有用户,在 cron 中等等。
      【解决方案4】:

      man perlrun 命令给出了这个问题的一些答案,但没有一个是完全可移植的。

      【讨论】:

        【解决方案5】:

        这在http://www.perlmonks.org/index.pl?node_id=118460进行讨论

        简而言之,无论你做什么,你最终都会在某个时刻假设一个二进制文件的路径,如果/usr/bin/perl 不起作用,那么 Perl 配置错误。

        (Windows 不关心 shebang 行)

        【讨论】:

        • 我同意最后一段,但第二段是错误的。在我运行 perl 的许多系统上,我没有管理员权限,也无权触摸 /usr/bin/perl,因此我将自己的安装在不同的位置。这些安装没有任何问题,无论是引用它们自己而不是 /usr/bin/perl 中预先存在的 Perl。
        • 第二段有些诙谐,引用了链接的文档。
        • 在我的例子中,perl 解释器安装在用户的主目录下。
        猜你喜欢
        • 1970-01-01
        • 2010-11-10
        • 2011-12-13
        • 1970-01-01
        • 2019-03-18
        • 1970-01-01
        • 1970-01-01
        • 2015-08-08
        • 2018-03-14
        相关资源
        最近更新 更多