Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
替换Ubuntu 16.04上的默认perl_Perl_Ubuntu - Fatal编程技术网

替换Ubuntu 16.04上的默认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/bin/perl

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

我试着用编译好的/usr/bin/perl替换/usr/bin/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
    技巧的优缺点。