【问题标题】:Replace default perl on Ubuntu 16.04替换 Ubuntu 16.04 上的默认 perl
【发布时间】:2017-10-13 03:17:43
【问题描述】:

我有一个用 Perl 编写的大型项目,其中包含许多以典型的 #!/usr/bin/perl 开头的脚本

对于这个项目,我需要一个从源代码编译的定制 Perl。

我试图将 /usr/bin/perl 替换为已编译的,但操作系统已损坏(例如模块版本不匹配等)。

那么有什么正确的方法可以用我自己构建的一个替换系统 perl,或者最简单的方法是编辑所有大量脚本并将 /usr/bin/perl 替换为 /usr/local/bin/perl 或其他东西像这样?

【问题讨论】:

  • 更换系统 Perl 会导致各种麻烦。将所有脚本的 shebang 更改为 #!/usr/bin/env perl 然后编译您自己的 Perl 会更有意义。如果您随后将该 Perl 移动到运行该应用程序的用户的 PATH 前面,那么您应该会很好。
  • my answerthis question 中,我讨论了#!/usr/bin/env 技巧的优缺点。

标签: perl ubuntu


【解决方案1】:

不要替换系统 perl(或一般的系统二进制文件)。您可以将其构建到另一个位置(如您建议的那样,例如 /usr/local)并手动调用它。

我个人的偏好是使用plenv。有一个很好的指南 here 可以帮助您入门。

如果您管理服务器并且其他用户正在使用您的脚本登录,您将需要在您的主目录之外的某个地方构建 pleenv(例如/opt/plenv)并确保所有用户 $PATH 都以 bin 开头你的新 perl 的路径。无需过多离题,这可以在/etc/profile 中完成,或者更好地在自定义配置文件脚本中声明您的自定义配置文件模块(例如/etc/profile.d/custom.sh)。

我还建议使用更便携的 shebang,例如 #!/usr/bin/env perl,它将首先使用用户 $PATH 中的任何 perl。唯一的例外是 cron 作业,我通常总是对完整路径进行硬编码。 (这是个人偏好,完全基于我管理我的盒子的方式,除非你知道完整的影响,否则可能不是推荐的好主意。管理服务器完全取决于它的用例,您的用例可能与我的用例有很大不同。

【讨论】:

  • Re "我还建议使用更便携的shebang",请不要! #!/usr/bin/env perl 不好!它是less 可移植的,因为它基于在给定时刻恰好位于给定用户的 PATH 中而中断!安装前shebang应该是#!/usr/bin/perl,安装后shebang行应该指向安装模块的perl。 (这是由 ExtUtils::MakeMaker 和 Module::Build 自动完成的。)
  • 我提供的信息可能不是最好塞进 SO 回复中。没错,硬编码通常更可靠。在 pleenv 的情况下,可能类似于 /opt/plenv/shims/perl。对我来说,我希望能够在我的不同服务器之间复制我的 perl 脚本,而无需修改任何东西。在我的各种系统上,正在使用的 perl 可能位于 4 个位置中的 1 个。我确保 PATH 在 profile 前面是 env perl 适合我。 YMMV
  • 看来#!/usr/bin/env perl 是解决问题的唯一方法。期待编辑 cronjob-scripts 和工作人员的大量工作:) 谢谢!
  • Re "在我的各种系统上,使用的 perl 可能在 4 个位置中的 1 个。",假设只使用一个 Perl,但我们在完全相反的情况。
  • aaaaaand,我刚刚意识到你的名字是 Andrey,而不是 Audrey。我对此表示诚挚的歉意。如果我可以编辑我的旧 cmets,我会的。
【解决方案2】:

根据 cmets,没有不破坏某些东西的替代系统 Perl 的解决方案,但是有 3 个解决方案来解决所描述的问题。对于所有这些,我需要修改所有脚本。

  1. 使用 #!/usr/bin/env perl(需要非常小心,并将自定义 perl bin 路径放在运行脚本的用户的 $PATH 之前。好的解决方案是将 PATH 完全设​​置为 crontab。
  2. 在 shebang 中使用直接的新 perl 路径,例如 #!/usr/local/bin/perl5.26.1
  3. 从脚本中完全删除 shebang,并在 cron 和手动运行中使用普通调用 - 例如 /usr/bin/perl script.pl。或者只使用普通调用 - shebang 会被忽略。

特别感谢@Joshua 和@ikegami

【讨论】:

猜你喜欢
  • 2017-07-14
  • 2017-05-11
  • 1970-01-01
  • 2016-10-27
  • 1970-01-01
  • 2016-11-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多