替换Ubuntu 16.04上的默认perl
我得到了一个用Perl编写的大型项目,其中包含许多以典型#开头的脚本/usr/bin/perl 对于这个项目,我需要从源代码编译一个定制的Perl 我试着用编译好的/usr/bin/perl替换/usr/bin/perl,但是操作系统坏了(比如模块版本不匹配等)替换Ubuntu 16.04上的默认perl,perl,ubuntu,Perl,Ubuntu,我得到了一个用Perl编写的大型项目,其中包含许多以典型#开头的脚本/usr/bin/perl 对于这个项目,我需要从源代码编译一个定制的Perl 我试着用编译好的/usr/bin/perl替换/usr/bin/perl,但是操作系统坏了(比如模块版本不匹配等) 那么,有没有什么正确的方法可以用我自己构建的perl替换系统,或者最简单的方法是编辑所有的脚本,并用/usr/local/bin/perl或类似的东西替换/usr/bin/perl?不要替换系统perl(或一般的系统二进制文件)。您可以
那么,有没有什么正确的方法可以用我自己构建的perl替换系统,或者最简单的方法是编辑所有的脚本,并用/usr/local/bin/perl或类似的东西替换/usr/bin/perl?不要替换系统perl(或一般的系统二进制文件)。您可以将它构建到另一个位置(如您建议的,
/usr/local
),然后手动调用它
我个人的偏好是使用。有一本很好的指南可以让你开始学习
如果您管理服务器,而其他用户正在使用脚本登录,则需要在主目录之外的某个位置构建plenv(例如,/opt/plenv
),并确保所有用户$PATH都在新perl的bin路径之前。在不离题的情况下,这可以在/etc/profile
中完成,或者更好地在自定义概要文件脚本(例如/etc/profile.d/custom.sh
)中声明自定义概要文件mod
我还建议使用更便携的shebang,比如
#/usr/bin/env perl
,它将首先使用users$PATH中的任何perl。唯一的例外是cron作业,我通常都会硬编码完整路径。(这是完全基于我管理邮箱的方式的个人偏好,除非你知道全部影响,否则推荐可能不是一个好主意。管理服务器完全是主观的,基于它的用例,你的用例可能与我的大不相同)。根据评论,在不破坏某些东西的情况下,没有替代系统Perl的解决方案,但是有三种解决方案可以解决所描述的问题。对于所有这些,我需要修改所有脚本
使用#/usr/bin/env perl(需要非常小心,将自定义perl bin路径放在运行脚本的用户的$path之前。最好的解决方案是将path精确地设置在crontab上
在shebang使用新的perl路径,如#!/usr/local/bin/perl5.26.1
从脚本中完全删除shebang,并在cron和手动运行时使用普通调用,比如as/usr/bin/perlscript.pl。或者只使用普通调用,shebang将被忽略
特别感谢@Joshua和@ikegami替换系统Perl会导致各种各样的麻烦。将所有脚本的shebang更改为#!/usr/bin/env Perl
,然后编译您自己的Perl会更有意义。如果您将Perl移动到运行应用程序的用户路径的前面,您应该会很好d、 在to中,我讨论了#!/usr/bin/env
技巧的优缺点,请不要这样做!#!/usr/bin/env perl
不好!它的可移植性较差,因为它在给定时刻恰好位于给定用户的路径中!安装前,shebang应该是#!/usr/bin/perl
,安装后,shebang行应该指向安装模块的perl
。(这是由ExtUtils::MakeMaker和Module::Build自动完成的。)我提供的信息可能不是最好的SO回复。你是对的,硬编码通常更可靠。在plenv的情况下,这可能类似于/opt/plenv/shimmes/perl
。对我来说,我喜欢能够在不同的服务器之间复制我的perl脚本,而无需修改任何内容。在我的各种系统上ems,使用中的perl可能在4个位置中的1个。我确保路径在概要文件中预先设置好,那么env perl
对我来说是否有效。YMMVIt似乎#!/usr/bin/env perl是解决此问题的唯一方法。期待着大量编辑cronjob脚本和工作人员的工作:)谢谢!Re“在我的各种系统上,使用的perl可能位于4个位置中的1个。“,这假设只有一个Perl在使用,但我们的情况恰恰相反。aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,我刚刚意识到你的名字是Andrey,而不是Audrey。对此我深表歉意。如果我可以编辑我的旧评论,我会的。在to中,我讨论了#!/usr/bin/env
技巧的优缺点。