Perl脚本,如何从.bash_profile中获取环境变量

时间:2014-05-29 20:50:37

标签: linux perl variables profile environment

我需要一些关于perl脚本的快速建议。我创建了一个脚本,基本上调用其他perl脚本和其中的许多其他shell脚本。我面临的问题只是试图通过设置一个环境变量来使其在通用级别上运行。

顺便提一下,这是在Linux RHEL / CentOS上......

所以我将我的变量添加到.bash_profile中,如果我首先手动获取文件,然后运行我的perl脚本,它的工作没有问题!这是,好的,但我希望脚本能够自动化这部分而不需要额外的手动采购步骤。

所以我的脚本看起来像这样......简而言之

#!/usr/bin/perl
use warnings;
use strict;

`/bin/bash ~/.bash_profile`;

blah blah blah more code etc;

启动主脚本时(代码的这一部分),它没有问题。这是对其他脚本失败的所有后续调用......好像它没有将变量传递给其余的脚本。

任何想法??

谢谢,

4 个答案:

答案 0 :(得分:4)

  • 最简单的方法是使用$ENV{"name"}=...在perl中设置环境变量。然后,这些变量将自动传播到从perl脚本中启动的任何程序,无论是perl还是shell脚本
  • 或者您可以打开.bash_profile,在perl中解析它,提取变量,然后在perl中使用$ENV再次设置它们。这很容易出错,因为可能有几种方法来声明变量。
  • 或者您可以生成一个shell,它会读取.bash_profile并在之后调用env。然后,您读取并解析此shell的输出。这与之前的提案类似,但您必须解析的输出更明确。
  • 或者你可以使用一个shell脚本来源.bash_profile然后生成perl脚本。

答案 1 :(得分:1)

反引号(以及systemopen等)会生成一个单独的进程,从Perl程序继承环境,但只会影响自己的环境,而不会将更改传回给Perl脚本。

Shell::GetEnv有一些技巧可以帮助您将这些更改合并到子环境中,但有时您会发现自己更容易解析.bash_profile


最近的Env::Modify模块可以处理此任务,利用Shell::GetEnv中的技巧。

use Env::Modify 'source';
source("$ENV{HOME}/.bash_profile");

答案 2 :(得分:1)

环境变量由子进程从其父进程继承,因此您只需从源自perl的shell中启动~/.bash_profile

bash登录shell会自动获取该文件,因此只需将bash设置为您的登录shell即可。您也可以使用bash -l

bash -lc 'exec script.pl args'

如果在启动Perl之前无法设置正确的环境,则可以引导bash登录shell。

if (@ARGV && $ARGV[0] eq 'setup') {
   shift(@ARGV);
} else {
   exec('bash', '-lc', 'exec "$@"', '-', $^X, $0, 'setup', @ARGV) or die $!;
}

在所有三种情况下,使用

访问变量
$ENV{VAR_NAME}

答案 3 :(得分:0)

使用$ ENV我们可以从.profile / .bash_profile获取任何值 例: 假设任何变量都存储在.profile / .bash_profile

导出CONNECT ="连接"

从.profile / .bash_profile中检索perl脚本中的相同变量:

我的$ DB_CONNECT = $ ENV {CONNECT};