gpt4 book ai didi

perl - 如何在两次 open 调用之间保持环境变量?

转载 作者:行者123 更新时间:2023-12-03 18:40:20 24 4
gpt4 key购买 nike

我有一个在 Windows 上运行的 perl 代码。此代码调用 open 两次以执行两个不同的批处理文件。第一个设置环境变量,第二个需要使用它。不幸的是,设置为变量的值在两次调用之间丢失了。

这是我的 Perl 代码。

my $hdl;
open($hdl, "set.bat |");
while(my $line = <$hdl>) {
print("$line\n");
}
close($hdl);

open($hdl, "get.bat |");
while(my $line = <$hdl>) {
print("$line\n");
}
close($hdl);

我的 set.bat 文件设置了环境变量:
set VAR=20
echo %VAR%

我的 get.bat 使用环境变量:
echo %VAR%

当我运行 perl 代码时,结果如下:
>perl my_code.pl
>set VAR=20
>echo 20
20
>echo
ECHO is on.

我们可以看到 set.bat 正确设置了 VAR 的值,但是 get.bat 无法使用它。

另外,如果我从 cmd 提示符连续运行我的两个批处理脚本,我会得到我期望的结果:
>set.bat
>set VAR=20
>echo 20
20
>get.bat
>echo 20
20

我该怎么做才能让我的第二个批处理脚本在我的 perl 代码中使用我的环境变量?

最佳答案

带有管道的 open 创建一个新进程†,然后您的 set.bat 在该进程中运行并在该进程中设置该环境变量,然后退出。

然后 get.bat 在另一个不同的进程中运行,并且看不到第一个进程的任何内容。

但是,它们都继承了运行 Perl 脚本的进程的环境。因此,您可以在脚本中设置所需的环境(例如通过 %ENV),然后创建一个子进程,然后该子进程看到该环境。‡

另一方面,您可以在同一个子进程中运行两个 shell 脚本,如果这符合您的目的,例如通过 system。然后可以将变量 export 写入环境中,在 source 之后,下一个要运行的脚本将看到它。这是 Linux 中的一个例子(现在不能做 Windows)。

一个命令行程序(“one-liner”)

perl -we'system("/bin/bash", "-c", q(source set.bat.sh; get.bat.sh))'

使用文件 set.bat.sh
#!/bin/bash
VAR=20
export VAR

和文件 get.bat.sh
#!/bin/bash
echo $VAR

one-liner 用 20 打印一行。

† 管道 open 通常被称为 fork 一个进程(参见 open ),但在 Windows 上只能模拟(通过线程),因为没有本地 fork ;见 perlfork 。但是, perlport 表示在 Windows 上
pipe- open 确实创建了一个子进程(通过 Win32 API)。

‡ 一个 Linux 示例(目前无法在 Windows 中测试)
perl -we'$v = qx("set.bat.sh"); chomp $v; $ENV{VAR} = $v; system("get.bat.sh")'

带有 set.bat.sh 文件
#!/bin/bash
VAR=20
echo $VAR

get.bat.sh
#!/bin/bash
echo $VAR

由于子进程不能直接改变其父进程的环境, set.bat.sh$VAR 打印到 STDOUT 然后它的父进程 perl 脚本可以从那个流中读取它(由 qx 捕获)并将它设置在它自己的环境中,它的下一个(grand -) 子 get.bat.sh 继承。 (一个 system fork 一个进程,其中另一个 fork 来运行 get.bat.sh 。环境被传递。)

当然,这样做的弱点是 perl 脚本需要知道变量的名称 VAR 。一个改进是 set.bat 将名称本身与值一起发送。

关于perl - 如何在两次 open 调用之间保持环境变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60184484/

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