gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 03:32:29 25 4
gpt4 key购买 nike

我想从“my_perl.pl”调用“env.sh”而不创建子shell。我尝试使用像这样的 backtics 和系统 --> system (.env.sh) [dot space env.sh] ,但是不起作用。

最佳答案

子环境无法更改父环境。最好的选择是从 Perl 代码内部解析 env.sh 并在 %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";
}

给定

foo=5
bar=10
baz="$foo$bar"
quux=`date +%Y%m%d`

打印

foo => 5
bar => 10
baz => 510
quux => 20110726

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

在执行 Perl 脚本之前获取 env.sh 的另一个原因是,对于希望看到它们的模块来说,在 Perl 中设置环境变量可能为时已晚。

在文件foo中:

#!/bin/bash

source env.sh

exec foo.real

其中 foo.real 是您的 Perl 脚本。

关于perl - 如何在perl脚本中获取shell脚本[环境变量]而不 fork 子shell?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6829179/

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