Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl: the Markov chain saw
 
PerlMonks  

Re^2: How to "source" a shell file in Perl?

by jfroebe (Vicar)
on Jun 12, 2013 at 19:33 UTC ( #1038563=note: print w/ replies, xml ) Need Help??


in reply to Re: How to "source" a shell file in Perl?
in thread How to "source" a shell file in Perl?

Pushing the environment variables to the parent process isn't possible I know but what I could do is create a child process, capture the environment variables that are set and send that back to the parent process to handle. A bit of a hack but that should satisfy the requirements.

Jason L. Froebe

Blog, Tech Blog


Comment on Re^2: How to "source" a shell file in Perl?
Re^3: How to "source" a shell file in Perl?
by LanX (Canon) on Jun 12, 2013 at 19:40 UTC
    That was my idea.

    Actually you could call a wrapper-shell-script which sources and calls a second perl-script.

    The perl-script use Data::Dumper to serialize %ENV and prints the string to STDOUT.

    opening the shell script with "wrapper.sh |" should¹ be sufficent to grab the dump.

    the second perl-script might look overhead but it's cleaner and you don't need to worry about k/ba/c-sh compatibilities and about JSON.

    Cheers Rolf

    ( addicted to the Perl Programming Language)

    ¹) open

    and if the filename ends with a '|', the filename is interpreted as a comma +nd which pipes output to us.
    ...
    For three or more arguments if MODE is '|-', the filena +me is interpreted as a command to which output is to be piped +, and if MODE is '-|', the filename is interpreted as a command +which pipes output to us.
Re^3: How to "source" a shell file in Perl?
by LanX (Canon) on Jun 12, 2013 at 20:04 UTC
    Congratulations, works for me :)

    open my $source,'-|',"bash /tmp/wrapper.sh" or die "$!"; my $dump= do { local $/; <$source>}; my $VAR1; eval $dump; print $VAR1->{MONK}; #> jfroebe

    lanx@nc10-ubuntu:/tmp$ cat wrapper.sh . /tmp/src.sh perl -MData::Dumper -e' print Dumper \%ENV' lanx@nc10-ubuntu:/tmp$ cat src.sh export MONK=jfroebe lanx@nc10-ubuntu:/tmp$

    Thats an extremely stable approach, I can't think of a way to make it break! =)

    you could even try to generate the code from wrapper.sh dynamically on the fly, hence avoiding any security/dependencies issues.

    Cheers Rolf

    ( addicted to the Perl Programming Language)

    UPDATE

    > you could even try to generate the code from wrapper.sh dynamically on the fly

    works! =)

    my $bashcode=<<'_bash_'; . /tmp/src.sh; perl -MData::Dumper -e "print Dumper \%ENV"; _bash_ open my $source, '-|', qq{bash -c '$bashcode'} or die "$!"; my $dump= do { local $/; <$source>}; my $VAR1; eval $dump; print $VAR1->{MONK}; #> jfroebe

    UPDATE

    far less code, same result

    my $bashcode=<<'__bash__'; . /tmp/src.sh; perl -MData::Dumper -e 'print Dumper \%ENV'; __bash__ my $VAR1; eval qx{bash -c "$bashcode"}; print $VAR1->{MONK}; #> jfroebe
      Thanks :) It works even in the more oddly configured environments here.

      Jason L. Froebe

      Blog, Tech Blog

        I have to admit that it's kind of a genius solution I really didn't expected to be possible at first.

        But the credits go to Perl's awesome flexibility! =)

        Cheers Rolf

        ( addicted to the Perl Programming Language)

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1038563]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others studying the Monastery: (9)
As of 2014-09-23 09:35 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    How do you remember the number of days in each month?











    Results (216 votes), past polls