【问题标题】:Set Unix env variables using a perl script使用 perl 脚本设置 Unix 环境变量
【发布时间】: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


【解决方案1】:

您首先尝试这样做的事实表明存在更大的问题,而这几乎肯定不是解决问题的最佳方法。但是,由于我们没有足够的信息来找到真正的根本原因,因此不可能提出更好的解决方案。不过,我们至少可以提出一个更短的解决方案:

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

您已经获得了key=value 格式的输入——无需在= 上进行拆分,然后在不进行任何进一步处理的情况下重新组合这些行。

现在,如果您有重复的变量名称,并且您试图使它们唯一,那么哈希将是适合使用的数据结构。但是,在这种情况下并没有什么不同,因为 shell 会做与 Perl 完全相同的事情(用以后的赋值覆盖现有的值)。

【讨论】:

    猜你喜欢
    • 2018-07-23
    • 2020-04-05
    • 2013-10-12
    • 2015-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多