我正在尝试使用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会给出错误。
有人可以帮忙吗?
答案 0 :(得分:1)
你首先尝试这样做的事实表明一个更大的问题,这几乎肯定不是解决问题的最佳方式。但是,由于我们没有足够的信息来了解实际的根本原因,因此无法提出更好的解决方案。不过,我们至少可以建议一个更短的解决方案:
eval `perl -lne 'print "export $_"' /vol.nas/rpas_qc/mohima/MOCKS/env_15`
您已经获得了key=value
格式的输入 - 无需拆分=
,然后重新构建这些行而无需进一步处理。
现在,如果你有重复的变量名并且你试图让它们成为唯一的,那么哈希将是适当的数据结构。但是,在这种情况下它没有任何区别,因为shell将完成与Perl完全相同的事情(用以后的赋值覆盖现有值)。