我有一个 shell 脚本,其中包含一系列的 shell 变量,在进入编程环境之前会执行该脚本。
我想使用 Perl 脚本来进入编程环境:
system("environment_defaults.sh");
system("obe");
但是当我进入环境时,变量没有被设置。
我有一个 shell 脚本,其中包含一系列的 shell 变量,在进入编程环境之前会执行该脚本。
我想使用 Perl 脚本来进入编程环境:
system("environment_defaults.sh");
system("obe");
但是当我进入环境时,变量没有被设置。
当您调用第二个命令时,它不是在您修改第一个命令的环境中执行的。事实上,来自第一个命令的任何环境都不存在了,因为用于调用“environment_defaults.sh”的shell已经退出。
为了在第二个命令中保留第一个命令的上下文,请在同一个shell中调用它们:
system("source environment_defaults.sh && obe");
source
调用shell脚本。$ENV{FOO} = "hello";
system('echo $FOO');
sh -c
进程将被调用,环境变量在其中被隔离。 environment_defaults.sh
也会在其中创建另一个sh进程,在这个进程中变量将被隔离设置?现在可以使用 Env :: Modify模块
完成此操作
use Env::Modify 'source'; # or use Env::Modify qw(source system);
source("environment_defaults.sh");
... environment from environment_defaults.sh is now available
... to Perl and to the following 'system' call
system("obe");
(更新:噢,这并不完全是你要求的东西,但它可能对某些人有用。)
如果 GDB已安装,则可以使用以下 hack(非严格样式用于清晰)设置/修改父 shell 变量:
#!/usr/bin/perl
# export.pl
use File::Temp qw( tempfile );
%vars = (
a => 3,
b => 'pigs'
);
$ppid = getppid;
my @putvars = map { "call putenv (\"$_=$vars{$_}\")" } keys %vars;
$" = "\n";
$cmds = <<EOF;
attach $ppid
@putvars
detach
quit
EOF
($tmpfh, $tmpfn) = tempfile( UNLINK => 1 );
print $tmpfh $cmds;
`gdb -x $tmpfn`
测试:
$ echo "$a $b"
$ ./export.pl
$ echo "$a $b"
3 pigs