Чтобы правильно ответить на этот вопрос, мне нужно знать немного больше.
- Можно ли вообще запускать скрипт оболочки из скрипта perl?
- Является ли переменнаявсе назначения в форме
export VAR=value
(т.е. с фиксированными назначениями, без подстановок переменных или подстановок команд)? - Делает ли сценарий оболочки что-либо еще, кроме присвоения переменных?
В зависимости отответы на эти, варианты различной сложности существуют.
Спасибо за разъяснения.Хорошо, вот как это сделать.Помимо присвоения переменных, ваш скрипт не имеет побочных эффектов.Это позволяет запускать скрипт изнутри perl.Как мы узнаем, какие переменные экспортируются в сценарий?Мы могли бы попытаться разобрать сценарий оболочки, но это не способ Unix использовать инструменты, которые хорошо выполняют одну вещь и объединяют их в цепочку.Вместо этого мы используем команду оболочки export -p
, чтобы она объявляла все экспортируемые переменные и их значения.Чтобы найти только переменные, фактически установленные скриптом, а не весь другой шум, скрипт запускается с чистой средой с использованием env -i
, еще одного недооцененного драгоценного камня POSIX.
Все вместе:
#!/usr/bin/env perl
use strict;
use warnings;
my @cmd = (
"env", "-i", "PATH=$ENV{PATH}", "sh", "-c", ". ./myshell.sh; export -p"
);
open (my $SCRIPT, '-|', @cmd) or die;
while (<$SCRIPT>) {
next unless /^export ([^=]*)=(.*)/;
print "\$ENV{$1} = '$2'\n";
$ENV{$1} = $2;
}
close $SCRIPT;
Примечания:
- Вам необходимо перейти на
env -i
всю среду, в которой нуждается myshell.sh
, например, PATH
. - Снаряды обычно экспортируют переменную
PWD
;если вы не хотите этого в своем хэше perl ENV, добавьте next if $1 eq 'PWD';
после первого next
.
Это должно сработать.Дайте мне знать, если это работает.
Смотрите также: