【发布时间】:2023-03-03 13:05:02
【问题描述】:
我正在尝试使用 perl 脚本为当前会话加载 Unix 环境变量。 env 变量手动定义一次,然后存储在 env 命令的文件输出中。 我尝试这样做的原因是因为需要设置许多变量,并且每次都很难在文本文件中找到变量并设置它们。
这是我的环境文件的一部分:
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)
这似乎工作正常。我可以回显我的环境变量并查看值。
但是我想要的是导出所有环境变量而不指定它们。所以在我的 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 会出错。
有人可以帮忙吗?
【问题讨论】:
-
这是个坏主意。首先,您的 Perl 程序在子 shell 中运行,并且在程序退出时更改将被丢弃。其次,您的 shell 会受到许多进程的更改,并且会保留以后可能不正确的值。而且,为什么在 shell 中“寻找”值比在文件中更容易?
-
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这是我输入文件的一部分:@Сухой27
-
@TLP,第一次手动设置env变量。然后将变量存储在一个文件中(env 命令的输出)。每次我们再次登录时,我们都需要查看这个文件,然后为我们的变量设置相同的值。取而代之的是,我试图将此文件读入哈希(env var 是具有相应值的键),然后在我的 perl 脚本中运行“打印导出 ...”命令。
-
@TLP 当我运行 eval
perlscript时,我可以看到我的 env 变量设置正确,但只有当我在 perl 脚本中指定 env var 名称时;所以这行得通: print "export RIDE_HOME=$hash{RIDE_HOME}\n";但这不是:*foreach $i(keys %hash){ print "export $i=$hash{$i}\n";* } -
@MohimaChaudhuri 我猜你在一些键中得到了空格,或者可能在一些值中也像
RIDE_OPTIONS= -d64。所以考虑修剪它们,即$val=~s/^\s*|\s*$//g。
标签: perl