gpt4 book ai didi

perl - 让 perl 执行 shellscript 并接管 env vars

转载 作者:行者123 更新时间:2023-12-04 22:45:04 26 4
gpt4 key购买 nike

我有一个 shell 脚本,它除了设置一堆环境变量之外什么都不做:

export MYROOTDIR=/home/myuser/mytools
export PATH=$MYROOTDIR/bin:$PATH
export MYVERSION=0.4a

我有一个 perl 脚本,我希望 perl 脚本以某种方式让 perl 脚本与 shell 脚本中列出的环境变量一起运行。不过,我需要在 perl 脚本中实现这一点,但我不希望 perlscript 的调用者首先手动获取 shellscript。

尝试运行时
system("sh myshell.sh")

环境变量不会“传播”到运行 perl 脚本的进程。

有没有办法做到这一点?

最佳答案

要正确回答这个问题,我需要了解更多。

  • 从 perl 脚本中实际运行 shell 脚本可以吗?
  • 变量赋值都是export VAR=value的形式吗? (即具有固定分配,没有变量替换或命令替换)?
  • 除了分配变量之外,shell 脚本还执行其他操作吗?

  • 根据对这些问题的回答,存在不同复杂性的选项。

    感谢您的澄清。好的,这是如何做到的。除了分配变量之外,您的脚本没有副作用。这允许从 perl 中运行脚本。我们如何知道脚本中导出了哪些变量?我们可以尝试解析 shell 脚本,但这不是 Unix 使用工具的方式,它可以很好地完成一件事并将它们链接在一起。相反,我们使用 shell 的 export -p命令让它宣布所有导出的变量及其值。为了只找到脚本实际设置的变量,而不是所有其他噪音,脚本在干净的环境中使用 env -i 启动。 ,另一个被低估的 POSIX gem。

    把它们放在一起:
    #!/usr/bin/env perl
    use strict;
    use warnings;

    my @cmd = (
    "env", "-i", "PATH=$ENV{PATH}", "sh", "-c", ". ./myshell.sh; export -p"
    );

    open (my $SCRIPT, '-|', @cmd) or die;
    while (<$SCRIPT>) {
    next unless /^export ([^=]*)=(.*)/;
    print "\$ENV{$1} = '$2'\n";
    $ENV{$1} = $2;
    }
    close $SCRIPT;

    笔记:
  • 您需要转至env -i所有环境您的 myshell.sh需要,例如PATH .
  • Shell 通常会导出 PWD多变的;如果你不想在你的 perl ENV 哈希中加入这个,添加 next if $1 eq 'PWD';第一次后next .

  • 这应该可以解决问题。让我知道它是否有效。

    也可以看看:
  • http://pubs.opengroup.org/onlinepubs/009695399/utilities/export.html
  • http://pubs.opengroup.org/onlinepubs/009695399/utilities/env.html
  • 关于perl - 让 perl 执行 shellscript 并接管 env vars,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5610672/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com