/ / Come esportare una variabile shell all'interno di uno script Perl? - perl, unix, shell, variabili d'ambiente

Come esportare una variabile di shell all'interno di uno script Perl? - perl, unix, shell, variabili di ambiente

Ho uno script di shell, con un elenco di variabili di shell, che viene eseguito prima di entrare in un ambiente di programmazione.

Voglio usare uno script Perl per entrare nell'ambiente di programmazione:

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

Ma quando entro nell'ambiente le variabili non vengono impostate.

risposte:

9 per risposta № 1

Quando chiami il tuo secondo comando, non viene eseguito nell'ambiente modificato nel primo comando. In effetti, lì è nessun ambiente rimanente dal primo comando, poiché la shell utilizzata per invocare "environment_defaults.sh" è già uscita.

Per mantenere il contesto del primo comando nel secondo, invocarli nella stessa shell:

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

Nota che devi invocare lo script della shell con source al fine di eseguire le sue azioni nel attuale shell, anziché invocare una nuova shell per eseguirle.

In alternativa, modifica il tuo ambiente all'inizio di ogni shell (ad es. Con .bash_profile, se usi bash), o modifica il tuo ambiente in perl stesso:

$ENV{FOO} = "hello";
system("echo $FOO");

2 per risposta № 2

Diverso sh -c i processi verranno chiamati e le variabili d'ambiente sono isolate al loro interno.

Inoltre, la chiamata a environment_defaults.sh non comporta anche un altro processo sh all'interno del quale queste variabili verranno impostate in modo isolato?

Oppure avvia lo script Perl con queste variabili d'ambiente esportate e queste verranno impostate per tutti i suoi processi figlio.


2 per risposta № 3

Ogni processo ottiene il proprio ambiente e ogni volta che si chiama "sistema" esegue un nuovo processo. Quindi, quello che stai facendo non funzionerà. Dovrai eseguire entrambi i comandi in un unico processo.

Ricorda, tuttavia, che dopo il tuo script Perlesiste, tutte le variabili d'ambiente che imposta non saranno disponibili nella riga di comando, perché anche il tuo script Perl è un processo con il suo ambiente.


0 per risposta № 4

(AGGIORNARE: Oh, questo non è esattamente quello che hai chiesto, ma potrebbe essere utile per qualcuno.)

Se GDB è installato, è possibile impostare / modificare le variabili della shell padre con il seguente hack (per chiarezza viene utilizzato lo stile non rigoroso):

#!/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`

Test:

$ echo "$a $b"

$ ./export.pl
$ echo "$a $b"
3 pigs

0 per risposta № 5

Ma si! Può essere!

#!/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");

Un po eccessivo poiché questo esegue un fork a un ambiente di solo Perl per il dump, ma eseguendo Perl bind ambiente in modo sicuro e Data::Dumper è il libreria da utilizzare per l'invio / l'archiviazione e il recupero di variabili Perl.

Nota: Questo non importa delle considerazioni sulla sicurezza: devi fidarti environment_defaults.sh allo stesso livello della sceneggiatura principale di Perl !!!


0 per risposta № 6

Questo ora può essere fatto con Env::Modify modulo

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");