【问题标题】:Sourcing shell scripts in Perl在 Perl 中采购 shell 脚本
【发布时间】:2011-02-18 23:47:00
【问题描述】:

我想从 Perl 中获取一个 shell 脚本,并让环境变量在 Perl 中可用,但我不确定是否有一种优雅的方法可以做到这一点。显然,使用system() 是行不通的,因为它在一个分叉的进程中运行,并且所有环境更改都将丢失。我认为有一个 CPAN 模块可以做到,但我不喜欢使用外部模块。

我见过两种在我的情况下不起作用的解决方案:

  1. 有一个调用 shell 脚本的包装器,然后调用 Perl 脚本。我不知道我需要调用哪些 shell 脚本。

  2. 手动打开 shell 脚本并抓取 arg=value 对。这也不起作用,因为 shell 脚本不是 ARG=VALUE 的简单列表,而是包含一堆条件,并且变量可以根据特定条件具有不同的值。

【问题讨论】:

  • 直到刚才我才意识到我必须点击一个按钮来表示答案是有用的。
  • 还有一个复选标记形状的按钮,您应该单击以表明您选择的最佳答案。

标签: perl shell


【解决方案1】:

sh -c "source script; env" 应该将脚本末尾的环境输出为 name=value 对,然后您可以从 perl 脚本中对其进行解析(因为 Perl 是一种用于解析的语言,这应该很容易)。

【讨论】:

  • 即使你不能触摸脚本,运行sh -c "source somescript; env" 应该是可行的。
  • 哦,这是一个完美的解决方案。谢谢!
  • @hobbs:感谢您的想法,我编辑了我的答案以包含此内容(以便以后参考)。
【解决方案2】:

您可以通过从 CPAN 安装外部模块来做到这一点,即 Shell::Source

$env_path= Shell::Source->new(shell=>"tcsh",file=>"../path/to/file/temp.csh");
$env_path->inherit;

由于 perl 在 shell 上运行时会创建自己的实例,所以我们不能为主 shell 设置环境路径,因为 perl 的实例就像主 shell 的子 shell。孩子不能为父母设置环境路径。

在 perl 的子 shell 运行之前,您将能够使用 Shell::Source 访问 temp.csh 中的所有路径

【讨论】: