使用perl脚本设置Unix env变量

时间:2015-11-15 11:05:02

标签: perl

我正在尝试使用perl脚本为当前会话加载Unix env变量。 env变量手动定义一次,然后存储在env命令的files-output中。 我尝试这个的原因是因为需要设置许多变量,并且很难在文本文件中每次都为变量捕获并设置它们。

这是我的环境文件的一部分:

    PYTHONPATH=:/usr/local/lib/python-lib:/usr/local/lib/python-lib/ptml: /usr/local/lib/python-lib/rbs:/usr/local/lib/python-lib/vsspy
RBUILDS=/vol.nas/u00/builds
RIDE_HOME=/vol.nas/rpas_qc/mohima/MOCKS/RPAS/tools
RIDE_OPTIONS= -d64
RPAS_HOME=/vol.nas/rpas_qc/mohima/MOCKS/RPAS/rpas
RPAS_JAVA_CLASSPATH=/vol.nas/rpas_qc/mohima/MOCKS/RPAS/rpas/lib/oracleRpasUtils.jar

我的perl脚本是这样的:

    open FILE, "/vol.nas/rpas_qc/mohima/MOCKS/env_15" or die;
my %hash;
while (<FILE>)
{
   chomp;
    ($key, $val) = split /=/;
   $hash{$key} = $val;
}
#foreach  $i(keys %hash){
 print "export RIDE_HOME=$hash{RIDE_HOME}\n";

 print "export RPAS_JAVA_CLASSPATH=$hash{RPAS_JAVA_CLASSPATH}\n";

如果我从我的shell运行它:

eval 'perl text2hash.pl': (name of the script is text2hash.pl)

这似乎工作正常。我可以回显我的env变量并查看值。

然而,我想要的是导出所有env变量而不指定它们。所以在我的perl脚本中,如果我有:

open FILE, "/vol.nas/rpas_qc/mohima/MOCKS/env_15" or die;
my %hash;
while (<FILE>)
{
   chomp;
    ($key, $val) = split /=/;
   $hash{$key} = $val;
}
*foreach  $i(keys %hash){
print "export $i=$hash{$i}\n";*
}

然后,如果我像以前一样运行相同的eval命令,我收到一条错误消息:

-ksh: eval[1]: export: 53553: is not an identifier

所以基本上,如果我在print命令中指定哈希的键名,那么eval似乎可以工作,但是如果我尝试循环遍历哈希以导出键值,则eval会给出错误。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

你首先尝试这样做的事实表明一个更大的问题,这几乎肯定不是解决问题的最佳方式。但是,由于我们没有足够的信息来了解实际的根本原因,因此无法提出更好的解决方案。不过,我们至少可以建议一个更短的解决方案:

eval `perl -lne 'print "export $_"' /vol.nas/rpas_qc/mohima/MOCKS/env_15`

您已经获得了key=value格式的输入 - 无需拆分=,然后重新构建这些行而无需进一步处理。

现在,如果你有重复的变量名并且你试图让它们成为唯一的,那么哈希将是适当的数据结构。但是,在这种情况下它没有任何区别,因为shell将完成与Perl完全相同的事情(用以后的赋值覆盖现有值)。