我正在与SGE(Sun Grid Engine)合作,将工作提交给网格。我也使用 perlbrew 管理我已安装的perl版本。我写了一些简短 sh 我用来运行需要特定perl版本(5.12.2)的perl脚本的脚本,该脚本看起来像这样:

#!/bin/bash
#$-S /bin/bash

source /home/dave/.bash_profile
/home/dave/perl5/perlbrew/bin/perlbrew switch perl-5.12.2

/home/dave/scripts/proc_12.pl --in=/home/dave/in/in.store --dir=/home/dave/in/dir2 --params=/home/dave/in/params.p

现在,当我提交一份工作时,一切都很好,但是当我提交许多工作时,我开始得到 perlbrew 相关错误消息,例如:

ln: creating symbolic link `current' to `perl-5.12.2': File exists
ln: creating symbolic link `/home/dave/perl5/perlbrew/bin/cpan' to `/home/dave/perl5/perlbrew/perls/current/bin/cpan': File exists
ln: creating symbolic link `/home/dave/perl5/perlbrew/bin/cpan2dist' to `/home/dave/perl5/perlbrew/perls/current/bin/cpan2dist': File exists
ln: cannot remove `/home/dave/perl5/perlbrew/bin/cpanp': No such file or directory
ln: cannot remove `/home/dave/perl5/perlbrew/bin/enc2xs': No such file or directory
ln: cannot remove `/home/dave/perl5/perlbrew/bin/find2perl': No such file or directory

所以我想 /home/dave/perl5/perlbrew/bin/perlbrew switch perl-5.12.2 线正在引起问题。

我能做些什么?

如何使用perl-5.12.2(默认为5.8.8)使脚本运行?

有帮助吗?

解决方案

我不建议把 perlbrew switch perl-5.12.2 在您运行的任何脚本中。它实际上仅用于命令行的使用。

如果您需要脚本来使用特定版本的Perl,请给它完整 perlbrew Shebang的路径:

#!/home/dave/perl5/perlbrew/perls/perl-5.12.2/bin/perl

use 5.012;
use warnings;
...

然后确保其可执行文件并像这样运行:

chmod +x your_perl_program.pl
./your_perl_program.pl

或者,或者在脚本中使用完整的PATHNAME到PERL二进制文件:

#!/bin/bash

/home/dave/perl5/perlbrew/perls/perl-5.12.2/bin/perl your_perl_program.pl


顺便说一句,如果您在脚本或Perl程序中运行任何不合格的内容,您将存在潜在的生产和安全问题。例如:

#!/bin/sh

# security risk
perl some_script.pl

# and not just perl
tar cvf archive.tar *.txt

# production risk
/home/dave/perl5/perlbrew/bin/perl some_other_script.pl

前两个很糟糕,因为它会拿到第一个 perl & tar 它在您的道路上找到。所以这取决于 $PATH 设置,这可能成为安全风险。最后一个也不好,因为它依赖于什么 perlbrew 目前已切换到其运行的时间点:(

因此,这样做可能是一场潜在的生产和安全噩梦。相反,以上应该像这样写:

#!/bin/sh

# fully qualified now.  Uses OS provided perl
/usr/bin/perl some_script.pl

# ditto
/usr/bin/tar cvf archive.tar *.txt

# this needs to run in perl 5.12.2
/home/dave/perl5/perlbrew/perls/perl-5.12.2/bin/perl some_other_script.pl

希望一切都有意义吗?

其他提示

我建议不要使用Perlbrew。它并没有真正带给您那么多的价值,并且只是对您使用的Perl感到困惑。 Perlbrew确实假设同时运行的所有内容都同意他们应该使用哪个Perl。我认为这只是头痛的秘诀,因为不同的程序开始从您的下面切换Perls,也许在您有机会使用您认为切换到的Perl之前。

只需安装所需的perl,然后调用所需的perl。

 $ perl5.12.2 /home/dave/scripts/proc_12.pl ...

例如,要安装刚从源树运行的PERL(带有所需的前缀):

 $ ./Configure -des -Dprefix=/usr/local/perls/perl-5.12.2
 $ make install

然后,我与我的所有安装perls symlink一起链接 make_links 脚本。当我想使用Perl 5.12.2时,我只使用〜/bin/perl5.12.2。我永远不必切换perls。当我要安装PERL模块时,我会使用CPAN:

 cpan5.12.2 Some::Module

我永远不确定我正在使用的版本,并且在移动Symlinks周围没有种族条件。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top