Как экспортировать переменную оболочки в сценарий Perl? - PullRequest
5 голосов
/ 03 июня 2010

У меня есть скрипт оболочки со списком переменных оболочки, который выполняется перед входом в среду программирования.

Я хочу использовать скрипт Perl для входа в среду программирования:

system("environment_defaults.sh");
system("obe");

Но когда я вхожу в среду, переменные не устанавливаются.

Ответы [ 6 ]

9 голосов
/ 03 июня 2010

Когда вы вызываете вторую команду, это не выполняется в среде, которую вы изменили в первой команде. На самом деле, - это , от первой команды не осталось среды, потому что оболочка, используемая для вызова "environment_defaults.sh", уже закрылась.

Чтобы сохранить контекст первой команды во второй, вызовите их в той же оболочке:

system("source environment_defaults.sh && obe");

Обратите внимание, что вам нужно вызывать сценарий оболочки с source для выполнения его действий в текущей оболочке, а не вызывать новую оболочку для их выполнения.

В качестве альтернативы, измените свою среду в начале каждой оболочки (например, с помощью .bash_profile, если используется bash), или измените переменную среды в самом perl:

$ENV{FOO} = "hello";
system('echo $FOO');
2 голосов
/ 03 июня 2010

Каждый процесс получает свою собственную среду, и каждый раз, когда вы называете «системой», он запускает новый процесс. То, что вы делаете, не сработает. Вам нужно будет выполнить обе команды в одном процессе.

Однако имейте в виду, что после того, как ваш Perl-скрипт существует, любые переменные среды, которые он устанавливает, не будут доступны вам в командной строке, потому что ваш Perl-скрипт также является процессом со своей собственной средой.

2 голосов
/ 03 июня 2010

Будут вызваны разные sh -c процессы, и переменные среды изолированы внутри них.

Также не вызывает вызывает environment_defaults.sh также сделать еще один процесс sh, в пределах которого эти переменные будут установлены изолированно?

Или запустите скрипт Perl с экспортированными переменными среды, и они будут установлены для всех его дочерних процессов.

0 голосов
/ 30 января 2017

Теперь это можно сделать с помощью модуля 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");
0 голосов
/ 29 декабря 2012

Но да! Это может быть!

#!/usr/bin/perl -w

use strict;

my $perldumpenv='perl -MData::Dumper -e '."'".
    '\$Data::Dumper::Terse=1;print Dumper(\%ENV);'."'";

eval '%ENV=('.$1.')' if `bash -c "
        source environment_defaults.sh >/dev/null;
        $perldumpenv"`
    =~ /^\s*\{(.*)\}\s*$/mxs;

system("obe");

Немного излишнее , так как это запускает разветвление в среду Perl-only-to-dump, но безопасная среда Perl привязки и Data::Dumper это библиотека использовать для отправки / сохранения и получения переменных Perl.

Примечание: Это не заботит соображения безопасности: вы должны доверять environment_defaults.sh на том же уровне, что и основной сценарий Perl !!!

0 голосов
/ 27 февраля 2012

( ОБНОВЛЕНИЕ : О, это не совсем то, что вы просили, но это может быть полезно для кого-то.)

Если установлена ​​ GDB , вы можете установить / изменить переменные родительской оболочки следующим способом (для ясности используется не строгий стиль):

#!/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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...