Ame*_*mer 0 linux perl centos7
我正在使用centos7群集,并且我使用root来安装所有必需的perl模块,但是当我以普通用户帐户检查已安装的perl模块时,没有模块列为root用户。
如何允许非root用户使用由root安装的Perl模块?
这是Perl安装目录
[root@mu ~]# perl -e 'print join "\n", @INC'
/root/perl5/lib/perl5/x86_64-linux-thread-multi
/root/perl5/lib/perl5
/usr/local/lib64/perl5
/usr/local/share/perl5
/usr/lib64/perl5/vendor_perl
/usr/share/perl5/vendor_perl
/usr/lib64/perl5
/usr/share/perl5
Run Code Online (Sandbox Code Playgroud)
对于root用户
[root@mu ~]# which perl
/usr/bin/perl
Run Code Online (Sandbox Code Playgroud)
对于非root用户
[bio@mu ~]$ which perl
/bin/perl
Run Code Online (Sandbox Code Playgroud)
所有用户的perl版本是
[root@mu ~]# perl -v
This is perl 5, version 16, subversion 3 (v5.16.3) built for x86_64-linux-thread-multi
Run Code Online (Sandbox Code Playgroud)
对于root用户:echo $ PATH和$ PERL5LIB
[root@mu ~]# echo $PATH
/opt/software/edirect:/opt/software/BEASTv1.10.1/bin:/opt/software/genometools-1.5.9/bin:/opt/software/ncbi-blast-2.7.1+/bin:/opt/software/bedtools2/bin:/opt/intel//impi/5.0.2.044/intel64/bin:/opt/intel/composer_xe_2015.1.133/bin/intel64:/opt/intel/composer_xe_2015.1.133/debugger/gdb/intel64_mic/bin:/usr/java/jre1.8.0_151/bin:/usr/java/jre1.8.0_151/bin:/opt/tsce/maui/sbin:/opt/tsce/maui/bin:/opt/tsce/torque6/bin:/opt/tsce/torque6/sbin:/usr/local/bin:/usr/lib64/qt-3.3/bin:/root/perl5/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt/ibutils/bin:.:/lustre/shared/software/maker/bin:/root/bin
[root@mu ~]#
[root@mu ~]# echo $PERL5LIB
/root/perl5/lib/perl5:
[root@mu ~]#
Run Code Online (Sandbox Code Playgroud)
对于非root用户:echo $ PATH和$ PERL5LIB
[bio@mu ~]$ echo $PATH
/opt/software/edirect:/opt/software/BEASTv1.10.1/bin:/opt/software/genometools-1.5.9/bin:/opt/software/ncbi-blast-2.7.1+/bin:/opt/software/bedtools2/bin:/opt/intel//impi/5.0.2.044/intel64/bin:/opt/intel/composer_xe_2015.1.133/bin/intel64:/opt/intel/composer_xe_2015.1.133/debugger/gdb/intel64_mic/bin:/usr/java/jre1.8.0_151/bin:/usr/java/jre1.8.0_151/bin:/opt/tsce/maui/sbin:/opt/tsce/maui/bin:/opt/tsce/torque6/bin:/opt/tsce/torque6/sbin:/usr/local/bin:/usr/lib64/qt-3.3/bin:/lustre/bio/perl5/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/opt/ibutils/bin:.:/lustre/shared/software/maker/bin
[bio@mu ~]$
[bio@mu ~]$ echo $PERL5LIB
/lustre/bio/perl5/lib/perl5:
[bio@mu ~]$
Run Code Online (Sandbox Code Playgroud)
我觉得你有点困惑。@INC包含Perl将在其中搜索模块的目录列表。打印的内容时,您将看不到各个模块的名称@INC。实际的模块将安装在输出中列出的目录下。
如果要查看模块的安装位置,可以使用perldoc -lm。
$ perldoc -lm Template
/usr/lib64/perl5/vendor_perl/Template.pm
$ perldoc -lm Time::Piece
/usr/lib64/perl5/Time/Piece.pm
Run Code Online (Sandbox Code Playgroud)
更新:您可以@INC通过运行以下命令来获取各个目录中安装的模块的完整列表:
$ perl -MFile::Find -E'find sub { say $File::Find::name if -f and /\.pm$/ }, @INC'
Run Code Online (Sandbox Code Playgroud)
更新:更改perldoc -l为(更好)perldoc -lm。
更新:如果用户和root看到的模块列表之间存在差异,则最明显的问题是两种类型的用户运行的是不同版本的Perl。尝试which perl同时以两种类型的用户身份运行,然后将输出添加到您的问题中。
另一个更新:好的,查看您添加到问题中的路径,看起来好像已经安装了多个版本的Perl。里面有Perl系统/usr/bin/,另外还有一个Perl,/bin/看来至少还有一个/lustre/bio/perl5/bin。可能还有更多。
每个Perl安装都会有自己的模块库。而且,将一个Perl安装的模块库与其他Perl安装一起使用并不是一个好主意。即使它们是Perl的相同版本,也可以使用不同的编译器标记来构建它们,这将影响编译模块的运行状况。
从CPAN安装Perl模块时,它会将其安装在与当前使用的Perl安装关联的模块库中。因此,您的root用户似乎已在将模块安装到与系统Perl相关联的库目录中。
因此,您需要选择要使用的Perl安装。您似乎想使用系统Perl,因为这是root用户正在使用的系统,而它似乎是安装了最多模块的系统。但是,对于为什么在该计算机上进行多个安装的更多了解的人也许可以为您提供更好的建议,以帮助您了解为什么要在计算机上的各种Perl安装之间进行选择。
选择Perl安装后,需要确保$APTH已设置变量,以便外壳程序首先找到该Perl可执行文件。并且您需要设置$PERL5LIB变量,以便它为该安装找到正确的模块库(尽管值得指出的是,所有Perl安装在构建时都会有默认的模块搜索路径“烧入”它们,除非您正在执行操作聪明,实际上您根本不需要$PERL5LIB设置。
总而言之,这些年来,您的服务器似乎已经由许多人进行了配置,并且出于我只能猜测的原因,他们都安装了自己的Perl版本。几乎可以肯定,最好的选择是与对服务器历史有更多了解的人交谈。