我想从"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脚本.
归档时间: |
|
查看次数: |
10464 次 |
最近记录: |