【发布时间】:2016-04-09 13:21:59
【问题描述】:
我的目标是注入 Perl 的 @INC 数组,它总是工作,并且在 任何条件下都可能调用 perl
为了在SpecialMoudle.pm 不在默认 @INC 数组中时使其工作,我添加了:
PERLLIB=/path/to/special/module
在 Linux 机器上的 /etc/environment 文件中,它可以正常工作:
$ perl -le "print for @INC"; perl -MSpecialMoudle -e "print qq/Yep SpecialMoudle.pm loaded\n/"
/path/to/special/module
/usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi
/usr/lib/perl5/site_perl/5.8.8
/usr/lib/perl5/site_perl
/usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi
/usr/lib/perl5/vendor_perl/5.8.8
/usr/lib/perl5/vendor_perl
/usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi
/usr/lib/perl5/5.8.8
.
我得到:
Yep SpecialMoudle.pm loaded
但是当我 ssh 到 同一台 机器
$ ssh $(hostname -i) 'perl -le "print for @INC"; perl -MSpecialMoudle -e "print qq/Yep SpecialMoudle.pm loaded\n/"'
我也一样:
/path/to/special/module
/usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi
/usr/lib/perl5/site_perl/5.8.8
/usr/lib/perl5/site_perl
/usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi
/usr/lib/perl5/vendor_perl/5.8.8
/usr/lib/perl5/vendor_perl
/usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi
/usr/lib/perl5/5.8.8
.
但奇怪的是我也得到了:
无法在 @INC 中找到 SpecialMoudle.pm(@INC 包含:/path/to/special/module /usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-多线程 /usr/lib/perl5/site_perl/5.8.8 /usr/lib/perl5/site_perl /usr/lib64/perl5/vendor_perl/5.8.8/x86_64-l inux-thread-multi /usr/lib/perl5/vendor_perl/5.8.8 /usr/lib/perl5/vendor_perl /usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/ 5.8.8 .)。 BEGIN 失败——编译中止。
当然没有输出...
现在,我在另一个装有 perl v5.10.1 的 Linux 机器上进行了同样的尝试,没有问题。在 this 框中,我有 perl v5.8.8 为什么它不起作用?特别是因为我在错误输出中看到 /path/to/special/module?
编辑为@pilcrow 添加,因为我在 StackOverflow 中看不到任何其他方式来显示易于阅读的原始数据。
(env | sort; which perl) 原始:
_=/bin/env
CVSROOT=:ext:10.20.30.40:/home/cvs/repository/
CVS_RSH=ssh
EDITOR=vi
G_BROKEN_FILENAMES=1
HISTSIZE=1000
HOME=/home/stackop
HOSTNAME=sdcbatch2
INPUTRC=/etc/inputrc
LANG=en_US.UTF-8
LESSOPEN=|/usr/bin/lesspipe.sh %s
LOGNAME=stackop
LS_COLORS=no=00:fi=00:di=00;34:ln=00;36:pi=40;33:so=00;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=00;32:*.cmd=00;32:*.exe=00;32:*.com=00;32:*.btm=00;32:*.bat=00;32:*.sh=00;32:*.csh=00;32:*.tar=00;31:*.tgz=00;31:*.arj=00;31:*.taz=00;31:*.lzh=00;31:*.zip=00;31:*.z=00;31:*.Z=00;31:*.gz=00;31:*.bz2=00;31:*.bz=00;31:*.tz=00;31:*.rpm=00;31:*.cpio=00;31:*.jpg=00;35:*.gif=00;35:*.bmp=00;35:*.xbm=00;35:*.xpm=00;35:*.png=00;35:*.tif=00;35:
MAIL=/var/spool/mail/stackop
PATH=/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin
PERLLIB=/path/to/special/module
PWD=/home/stackop
SHELL=/bin/bash
SHLVL=1
SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass
SSH_CLIENT=100.101.102.103 65279 22
SSH_CONNECTION=100.101.102.103 65279 10.30.50.70 22
SSH_TTY=/dev/pts/1
TERM=ansi
USER=stackop
/usr/bin/perl
(ssh $(hostname -i) 'env | sort; which perl') 原始:
_=/bin/env
HOME=/home/stackop
LANG=en_US.UTF-8
LOGNAME=stackop
MAIL=/var/mail/stackop
PATH=/usr/local/bin:/bin:/usr/bin
PERLLIB=/path/to/special/module
PWD=/home/stackop
SHELL=/bin/bash
SHLVL=1
SSH_CLIENT=10.30.50.70 39857 22
SSH_CONNECTION=10.30.50.70 39857 10.30.50.70 22
USER=stackop
/usr/bin/perl
【问题讨论】:
-
在您的脚本中添加
use lib qw( /path/to/special/module );有问题吗? -
是的,那么它会起作用,但
PERLLIB的全部意义不是在命令行上使用use lib -
请区分
env | sort; which perl和ssh $(hostname -i) 'env | sort; which perl'您提到 PERLLIB [原文如此] 而不是 PERL5LIB 是不寻常的。我的猜测是您的控制台登录 shell 定义了 $PERL5LIB ,它覆盖了 $PERLLIB 并且 还搜索$Config{version}和$Config{archname}子目录(PERLLIB 在 5.10 下不适合我)。不过,可能是不同的 perls。无论如何,您的 ssh shell 设置环境的方式不同。 -
我做了一个 diff,PERLLIB 和 PERL5LIB 从未在这个系统上使用过,我正在介绍使用,以便预先填充 INC 数组,我可以参考我的 SpecialMoudle 知道它已经在 INC 中
-
是的,PERLLIB 本身在两种情况下都设置了
(env | sort; which perl) | grep PERL.*LIB和(ssh $(hostname -i) 'env | sort; which perl') | grep PERL.*LIB返回相同的PERLLIB=/path/to/special/module
标签: perl unix ssh environment-variables