【问题标题】:Perl script, how to source an environment variables from .bash_profilePerl 脚本,如何从 .bash_profile 获取环境变量
【发布时间】:2014-05-29 20:50:36
【问题描述】:

我需要一些关于 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;

在启动主脚本(这部分代码所在的位置)时,它可以正常工作。对其他脚本进行的所有后续调用都失败了......好像它没有将变量传递给其余脚本。

有什么想法吗??

谢谢,

【问题讨论】:

  • 我不知道 perl,但我想包含实际调用其他脚本的代码是相关的。

标签: linux perl variables profile environment


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

【讨论】:

  • 最后一个选项是最简单的。
  • 好吧,我试一试...可以将 $ENV{"name"}= 设置为类似于标量和数组吗?我的意思是,我可以做类似 $ENV{"VARI"}=/bin/cat ~/.bash_profile | sed 's/VARI=//g';
  • 不在我的脚本所在的家里,否则我只是尝试而不是问大声笑......对不起我的无知
  • 好吧,我刚刚创建了一个小脚本来试用它,但没有成功。看起来我需要想出一个替代方案......可能将. ~/.bash_profile 添加到每个脚本的标题可能是我唯一的解决方案。谢谢大家的帮助
  • 实际上,最简单的方法是测试是否设置了 %ENV 的必要成员,如果失败,则会提示用户在运行脚本之前正确配置其帐户。
【解决方案2】:

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

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}

【讨论】:

  • 我将不得不再试一次......最终,我只是添加了 . ~/.bash_profile 到我所有脚本的第二行,它现在按预期工作。这确实是一个虚拟证明…… .bash_profile 是在登录时获取的,所以这更能防止“新手”不得不知道如何获取配置文件,或者注销然后重新登录。这个想法是能够将 .tar 包与我的脚本及其子目录一起使用,并让它们在没有太多干预的情况下工作......只需将变量添加到 .bash_profile 并关闭编辑器
【解决方案3】:

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

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


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

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

【讨论】:

    【解决方案4】:

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

    导出 CONNECT="连接"

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

    我的 $DB_CONNECT = $ENV{CONNECT};

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-22
      • 1970-01-01
      • 1970-01-01
      • 2013-10-26
      • 1970-01-01
      相关资源
      最近更新 更多