Можем ли мы получить сценарий оболочки в Perl? - PullRequest
2 голосов
/ 09 сентября 2010

можем ли мы написать скрипт оболочки в скрипте perl ??

Пример: Программа 1:

cat test1.sh
#!/bin/ksh
DATE=/bin/date

программа 2:

cat test2.sh
#!/bin/ksh
. ./test1.sh  
echo `$DATE`

Программа 3:

cat test3.pl
#!/usr/bin/perl
### here I need to source the test1.sh script
print `$DATE`'

Как получить оболочку в perl, чтобы получить дату, когда я запускаю test3.pl

спасибо Рагу

Ответы [ 6 ]

4 голосов
/ 09 сентября 2010

Вы не можете сделать

system("source src.sh");

system() запускает новую вложенную оболочку, переменные среды не передаются в оболочку, в которой выполняется скрипт Perl. Даже если ваш сценарий оболочки экспортирует переменные, он экспортирует их в вложенную оболочку, а не в ваша настоящая оболочка.

Одним из решений было бы написать скрипт-обертку, который

  1. Сначала исходники сценария оболочки, а затем
  2. Запускает скрипт Perl
1 голос
/ 14 мая 2012

Вы можете сделать что-то простое, например:

system "source /path/to/shell_env.sh &&"
     . "/path/to/script.sh";

Обратите внимание, что это отличается от следующего, что не рекомендуется:

   system "source /path/to/shell_env.sh &&"
        . "/bin/sh /path/to/script.sh";
0 голосов
/ 30 января 2017

Да, теперь вы можете сделать это с помощью модуля Env::Modify .

use Env::Modify qw(:ksh source);
source("./test1.sh");     # env settings from test1.sh now available in Perl
print `$ENV{DATE}`;       # print `/bin/date`;
0 голосов
/ 01 октября 2010

Я не знаю, что это поможет, но я был вынужден придумать способ написать это на Perl.Мое намерение состояло в том, чтобы Perl запустил сценарий оболочки и назначил любые переменные оболочки, которые он устанавливает, переменным с одинаковыми именами в сценарии Perl.

Остальные верны в том, что любой сценарий оболочки, который вы «используете», собираетсябыть в под-оболочке.Я подумал, что мог бы использовать «sh -x cmd», чтобы хотя бы оболочка показывала переменные в том виде, в котором они установлены.

Вот что я написал:

use strict;  use warnings;

our $DATE;

my $sh_script = "./test1.sh";

my $fh;
open($fh, "sh -x '$sh_script' 2>&1 1>/dev/null |") or die "open: $!";
foreach my $line (<$fh>) {
    my ($name, $val);
    if ($line =~ /^\+ (\w+)='(.+)'$/) {  # Parse "+ DATE='/bin/date;'
        $name = $1;
        ($val = $2) =~ s{'\\''}{'}g;  # handle escaped single-quotes (eg. "+ VAR='one'\''two'")
    } elsif ($line =~ /^\+ (\w+)=(\S+)$/) {  # Parse "+ DATE=/bin/date"
        $name = $1;
        $val = $2;
    } else {
        next;
    }
    print "Setting '$name' to '$val'\n" if (1);
    # NOTE: It'd be better to use something like "$shell_vars{$name} = $val",
    #  but this does what was asked (ie. $DATE = "/bin/date")...
    no strict 'refs';
    ${$name} = $val;    # assign to like-named variable in Perl
}
close($fh) or die "close: ", $! ? $! : "Exit status $?";

print "DATE: ", `$DATE` if defined($DATE);

Там, безусловно, больше ошибок-вы можете проверить, но это помогло мне, если все, что вы хотите поймать, это переменные оболочки.

0 голосов
/ 09 сентября 2010

Хм ... это мошенничество ниже?

#!/bin/sh
. ./test1.sh # source the test script
echo Bash says $DATE
export DATE;      # KEY to have the below Perl bit see $ENV{DATE}
perl <<'ENDPERL';
    print "Perl says $ENV{DATE}\n";
ENDPERL

Проблема в том, что поиск файла sh может делать что угодно, а не просто назначать значение X переменной Y ...

0 голосов
/ 09 сентября 2010

Вы не можете использовать файлы оболочки в Perl 5. Sourcing буквально выполняет команды в файле оболочки в целевой оболочке;однако, открыть и прочитать файл тривиально:

#!/usr/bin/perl

use strict;
use warnings;

use Carp;

sub source {
    my $file = shift;
    open my $fh, "<", $file
        or croak "could not open $file: $!";

    while (<$fh>) {
        chomp;
        #FIXME: this regex isn't quite good enough
        next unless my ($var, $value) = /\s*(\w+)=([^#]+)/;
        $ENV{$var} = $value;
    }
}

source "./test1.sh";

print "$ENV{DATE}\n";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...