我正在使用SGE(Sun Grid Engine)向网格提交作业。我还使用perlbrew
来管理我安装的Perl版本。
我写了一些简短的sh
脚本,用于运行perl脚本,需要特定的Perl版本(5.12.2),如下所示:
#!/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)运行脚本?
答案 0 :(得分:4)
我建议不要使用perlbrew。它并没有真正给你那么多的价值,它只会让你对你正在使用的perl产生混淆。 perlbrew确实假设同时运行的所有内容都同意他们应该使用哪个perl。我认为这只是一个令人头痛的秘诀,因为不同的程序开始从你身下转换出perls,也许在你有机会使用你认为你切换到的perl之前。
只需安装你想要的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
我从不确定我正在使用什么版本,并且在移动符号链接时没有竞争条件。
答案 1 :(得分:3)
我不建议将perlbrew switch perl-5.12.2
放在您运行的任何脚本中。它实际上仅用于命令行使用。
如果您需要一个脚本来使用特定版本的Perl,那么请在shebang上为其提供完整的perlbrew
路径:
#!/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
前两个是不好的,因为它会拿起第一个perl
& tar
它会在你的路径中找到。因此,这取决于$PATH
设置,这可能会成为安全风险。最后一个也不好,因为它依赖于perl 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
希望一切都有意义吗?