如何在perl脚本中获取shell脚本[环境变量]而不需要子shell?

Man*_*nde 8 shell perl

我想从"my_perl.pl"调用"env.sh"而不需要子shell.我尝试了这样的backtics和系统 - > system (. env.sh)[dot space env.sh],但不会工作.

Cha*_*ens 14

子环境无法更改父环境.你最好的办法是env.sh从Perl代码中解析并设置变量%ENV:

#!/usr/bin/perl

use strict;
use warnings;

sub source {
    my $name = shift;

    open my $fh, "<", $name
        or die "could not open $name: $!";

    while (<$fh>) {
        chomp;
        my ($k, $v) = split /=/, $_, 2;
        $v =~ s/^(['"])(.*)\1/$2/; #' fix highlighter
        $v =~ s/\$([a-zA-Z]\w*)/$ENV{$1}/g;
        $v =~ s/`(.*?)`/`$1`/ge; #dangerous
        $ENV{$k} = $v;
    }
}

source "env.sh";

for my $k (qw/foo bar baz quux/) {
    print "$k => $ENV{$k}\n";
}
Run Code Online (Sandbox Code Playgroud)

特定

foo=5
bar=10
baz="$foo$bar"
quux=`date +%Y%m%d`
Run Code Online (Sandbox Code Playgroud)

它打印

foo => 5
bar => 10
baz => 510
quux => 20110726
Run Code Online (Sandbox Code Playgroud)

代码只能处理简单文件(例如,它不处理if语句或foo=$(date)).如果你需要更复杂的东西,那么为你的Perl脚本编写一个env.sh首先获取源代码的包装器是正确的方法(它也可能是首先出现的正确方法).

env.sh在执行Perl脚本之前获取源代码的另一个原因是在Perl中设置环境变量可能对于期望看到它们的模块来说太晚了.

在文件中foo:

#!/bin/bash

source env.sh

exec foo.real
Run Code Online (Sandbox Code Playgroud)

其中foo.real是你的Perl脚本.