6

我正在使用 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)使我的脚本运行?

4

2 回答 2

4

我建议不要使用 perlbrew。它并没有真正给你带来那么多价值,它只会让你对你使用的 perl 感到困惑。perlbrew 真的假设同时运行的所有东西都同意他们应该使用哪个 perl。我认为这只是一个让人头疼的方法,因为不同的程序开始从你下面切换 perls,也许在你甚至有机会使用你认为你切换到的 perl 之前。

只需安装您想要的 perls 并调用您想要的 perls。

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

例如,要安装一个 perl,您只需从源代码树运行(使用您想要的任何前缀):

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

然后我用我的make_links脚本为我安装的所有 perls 建立符号链接。当我想使用 Perl 5.12.2 时,我只使用 ~/bin/perl5.12.2。我永远不必切换 perls。当我想安装 Perl 模块时,我使用 cpan:

 cpan5.12.2 Some::Module

我从来不确定我使用的是什么版本,并且在移动符号链接时没有竞争条件。

于 2010-09-23T08:15:29.847 回答
4

我不建议将其放入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

或者在脚本中使用 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

前两个不好,因为它会拾取第一个perltar在您的路径中找到。所以这取决于$PATH设置,这可能会成为安全风险。最后一个也不好,因为它依赖于 perlperlbrew当前在运行时切换到的内容:(

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

#!/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

希望一切都有意义?

于 2010-09-23T08:26:14.680 回答