2011-08-06 42 views
2

我有这样的Perl脚本:访问shell变量在Perl程序

#!/usr/bin/perl 

$var = `ls -l \$ddd` ; 
print $var, "\n"; 

和DDD是一个shell变量

$ echo $ddd 
arraytest.pl 

当我执行的Perl脚本,我得到的所有文件中的列表目录而不是只有一个文件,其文件名包含在shell变量$ ddd中。

这里发生了什么?请注意,我在Perl脚本中以反引号方式转义$ ddd。

回答

5

变量$ddd没有设置*在shell您从Perl脚本调用。

普通shell变量不会被子进程继承。环境变量是。

如果你想要这个工作,你需要做的外壳下面的一个调用你的Perl脚本之前:

ddd=arraytest.pl ; export ddd # sh 

export ddd=arraytest.pl  # bash, ksh, zsh 

setenv ddd arraytest.pl  # csh, tcsh 

这将使环境从你的Perl脚本变量$ddd可见。但是,那么它可能更有意义,称其为$ENV{ddd},而不是文字串'$ddd'传递到外壳,让它展开:

$var = `ls -l $ENV{ddd}`; 
2

散列%ENV包含您当前的环境。

$var = `ls -l $ENV{ddd}`; 

/编辑 - 它的工作原理,托运,当然DDD的需要行书之前导出

export ddd='arraytest.pl' 
perl script.pl 
+0

只有当它是一个环境变量 - 如果它是,原始代码才会起作用,因为它将文字''ddd''传递给shell,它会扩展它。 –

+0

它没有工作。我试图打印$ ENV {ddd},但没有o/p。 – abc

+0

是的,很好的抓住它不是一个环境变量。它是一个shell变量。我没有出口它。有没有一种方法可以在Perl的backquotes中指定shell变量? – abc

3

你忘了export ddd

马克各名称传递给环境中的子进程。

所以ddd不会自动提供给子进程。

+0

感谢您发布的参考链接! – abc

+0

@abc:Keith的彻底改善,我只是在这里留下了我的答案。 –

+0

您忘了%ENV – nxadm