. $> echo $LOG В то время как я бегу в терминале вручную (не из сценария). Я следовал за"> . $> echo $LOG В то время как я бегу в терминале вручную (не из сценария). Я следовал за"> . $> echo $LOG В то время как я бегу в терминале вручную (не из сценария). Я следовал за" />

Экспортируйте переменную из сценария оболочки в сценарий жемчуга

Кодекс Perl

`. /home/chronicles/logon.sh `; 

print "DATA  : $ENV{ID}\n";

В logon.sh мы экспортируем переменный "ID" (сорсинг сценария оболочки).

Manual run

$> . /home/chronicles/logon.sh
$> echo $LOG

В то время как я бегу в терминале вручную (не из сценария). Я получаю продукцию. (Но не работающий из сценария)

Я следовал за этой почтой:

How to export a shell variable within a Perl script?

Но не решил проблему.

Примечание

Мне не разрешают изменить "logon.sh" сценарий.

1
добавлено автор F. Hauri, источник

6 ответы

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

Однако вы могли возвратить содержание детской переменной окружения и поместить ее в переменную Perl как

use strict; use warnings; use feature 'say';
my $var = `ID=42; echo \$ID`;
chomp $var;
say "DATA: $var";

продукция:

DATA: 42

Здесь пример обстреливает сессию:

$ cat test_script
echo foo
export test_var=42
$ perl -E'my $cmd = q(test_var=0; . test_script >/dev/null; echo $test_var); my $var = qx($cmd); chomp $var; say "DATA: $var"'
DATA: 42

Нормальная продукция перенаправляется в /dev/null , поэтому только $test_var эха шоу.

2
добавлено
Это - хороший подход, но я изменил бы пример на: мой $id = qx (. logon.sh; отзовитесь эхом \$ID)
добавлено автор William Pursell, источник
@Chronicles Тогда просто заставляют сценарий замолчать — вы - not' t использование продукции так или иначе. Посмотрите мое обновление для этого. Если вам действительно нужна продукция, перенаправьте ее к файлу вместо этого и читайте оттуда.
добавлено автор amon, источник
Это печатает продукцию сценария. (Не печать экспортируемых данных). Мне не разрешают изменить logon.sh сценарий.
добавлено автор Debaditya, источник

This can now be done with the Env::Modify module

use Env::Modify 'source';
source("/home/chronicles/logon.sh");
... environment setup in logon.sh is now available to Perl ...
1
добавлено

Ну, я имею, находят решение, которые звучат хороших для меня: Это кажется прочным, поскольку это использование широко проверило механизм, чтобы обязать среду оболочки с жемчугом (бегущий жемчуг) и прочная библиотека экспортировать их в синтаксис переменной жемчуга для перевпрыскивания на сессии жемчуга корня.

Линия , экспорт ОКРАШИВАЕТ tty , была полезна, чтобы попросить, чтобы мой удар экспортировал более новые переменные... Это кажется, хорошо работают.

#!/usr/bin/perl -w

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

eval '%ENV=('.$1.')' if `bash -c "
        . ./home/chronicles/logon.sh;
        export COLOR tty ID;
        $perldumpenv"`
    =~ /^\s*\{(.*)\}\s*$/mxs;

# map { printf "%-30s::%s\n",$_,$ENV{$_} } keys %ENV;
printf "%s\n", $ENV{'ID'};

Так или иначе, если у вас нет доступа, чтобы logon.sh , у вас есть к <сильному> доверию он прежде, чем управлять таким решением.

Старый...

Есть мой первый пост... для цели истории, не смотрите далее.

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

my @lines=split("\n",`. /home/chronicles/logon.sh;set`);

map { $ENV{$1}=$2 if /^([^ =])=(.*)$/; } @lines;
1
добавлено
Придеритесь к мелочам: Ваш код эквивалентен, чтобы печать '. / home/ chronicles/ logon.sh; набор'; . В контексте списка оператор обратной галочки возвращает список линий продукции. Кроме того, это неидиоматично, чтобы использовать карту в недействительном контексте. <в коде> говорятся для @lines или , печать "$ _ \n" для @lines достигла бы того же самого.
добавлено автор amon, источник

Вы могли сделать что-то как:

#/usr/bin/perl

use strict;
use warnings;

chomp(my @values = `. myscript.sh; env`);

foreach my $value (@values) {
    my ($k, $v) = split /=/, $value;
    $ENV{$k} = $v;
}

foreach my $key (keys %ENV) {
    print "$key => $ENV{$key}\n";
}
1
добавлено

Ничего не выйдет.

Переменная окружения не может быть унаследована от дочернего процесса.

Переменная окружения может быть обновлена в вашем "ручном пробеге", то, потому что это находится в том же самом процессе "удара".

Исходная команда должна только управлять каждой командой в login.sh под текущей раковиной.

More info you can refer to: can we source a shell script in perl script

1
добавлено

Ваш процесс Perl - родитель процесса раковины, таким образом, это не унаследует переменные окружения от него. Наследование работает другой путь от родителя ребенку.

Но когда вы управляете сценарием с обратными галочками, как показано, стандартный вывод сценария возвращен к сценарию Perl. Так, или измените сценарий оболочки, чтобы закончиться заявлением $LOG эха, которое вы показываете или создаете новый сценарий оболочки, который управляет login.sh и затем имеет $LOG эха. Ваш сценарий Perl тогда был бы:

my $value = `./myscript.sh`;
print $value;
0
добавлено
Modern::Perl
Modern::Perl
362 участник(ов)

Пожалуйста, представьтесь при добавлении в группу. Это необходимо во избежание спам-ботов. Ваше первое сообщение не должно быть ссылкой или репостом. Мы всегда рады нестандартным вопросам.

use Perl or die;
use Perl or die;
164 участник(ов)

Группа о языке Perl и обо всём что с ним связано.

pro.bash
pro.bash
123 участник(ов)

All about Nix shells, signals, processes and development in general.

pro.perl
pro.perl
22 участник(ов)

Язык программирования Perl