我应该将什么用于Perl脚本的shebang线?

Ano*_*ous 46 perl shebang

使用哪个更好或更快作为Perl脚本的shebang行?

#! perl

#! perl.exe

#! fullpath/perl(/perl.exe)

#! partialpath/perl(/perl.exe)
Run Code Online (Sandbox Code Playgroud)

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


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

Sch*_*ern 64

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

  • 原因#19382不能以root用户身份登录.使用`sudo`.;) (12认同)
  • 在Unix上,如果计算机上有多个Perl版本,`#!/ usr/bin/env perl`可能会导致问题.例如,用户帐户的"PATH"设置为在/ usr/bin/perl`之前有另一个Perl.用户以"root"身份登录.然后当root尝试运行系统脚本时,这实际上运行非系统perl.所以系统脚本不应该使用它. (5认同)
  • @DVK你是对的,有轻微的不兼容性,我们可以整天挑选它们.现在,哪个更好:在你的路径中没有任何称为"perl"的东西,并且没有机会运行脚本寻找"perl",并且在你的路径中有一个叫做"perl"的东西(你不需要root就可以了你路径中的perl符号链接)并且有很好的机会? (5认同)
  • @Schwern - 你忘记了一件事 - 并非所有用户首选的`perl`二进制文件都被命名为`perl` :( [我们的是perl5.8] (3认同)
  • 当然,并非所有unix都将env放在/ usr/bin中. (2认同)
  • @ Jim2B是的,几乎所有*Unix都将perl放在`/ usr/bin`中.[`/usr/bin/env`](https://en.wikipedia.org/wiki/Env)不是目录,它是一个程序.`#!/ usr/bin/env interpreter`是在不使用硬编码路径的情况下启动解释器的常用方法. (2认同)

Chr*_*heD 8

Windows she-bang(从perl.exe位推断出来)似乎无关紧要,因为你的(咳)"shell"可能甚至不解析它(如果我错了,请纠正我,最近可能会改变).

Perl本身仍然可以拾取一些命令行标志(根据此线程).


DVK*_*DVK 6

  1. 正如ChristopheD指出的那样,我可以从实践中确认(XP上的ActivePerl),在Windows上并不是真的需要shebang线.

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

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

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

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


小智 6

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


小智 5

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

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