2010-06-03 12 views
5

Ho uno script di shell, con un elenco di variabili di shell, che viene eseguito prima di entrare in un ambiente di programmazione.Come esportare una variabile di shell all'interno di uno script Perl?

voglio usare uno script Perl per accedere all'ambiente di programmazione:

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

Ma quando entro l'ambiente le variabili non sono impostate.

+0

"dentro" ........ – Tom

risposta

2

Diversi processi sh -c vengono chiamati e le variabili di ambiente sono isolate all'interno di questi.

Inoltre, non chiama environment_defaults.sh anche eseguire un altro processo sh all'interno del quale queste variabili verranno impostate in isolamento?

Oppure avviare lo script Perl con queste variabili di ambiente esportate e queste verranno impostate per tutti i relativi processi figlio.

9

Quando si chiama il secondo comando, non viene eseguito nell'ambiente modificato nel primo comando. Infatti, lo è nessun ambiente rimanente dal primo comando, poiché la shell utilizzata per richiamare "environment_defaults.sh" è già stata chiusa.

Per mantenere nell'ambito del primo comando nel secondo, li invocano nella stessa shell:

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

Nota che è necessario richiamare lo script shell con source al fine di eseguire le sue azioni nel corrente shell, piuttosto che invocare una nuova shell per eseguirli.

alternativa, modificare l'ambiente all'inizio di ogni guscio (ad esempio con Bash_profile, se si utilizza bash), oppure creare ambiente variabile cambia in Perl:

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

questo non funziona come environment_defaults.sh renderà figlio sub-esempio –

+0

Thnks, ho proverò la prima opzione. Le altre due opzioni sono quelle che sto cercando di evitare. – lamcro

+0

@Imre: true, se si esegue semplicemente lo script verrà invocata una nuova shell. Usa 'fonte' per eseguire i comandi nella stessa shell (risposta aggiornata). – Ether

2

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

Tenere presente, tuttavia, che dopo che lo script Perl esiste, tutte le variabili di ambiente impostate non saranno disponibili nella riga di comando, poiché lo script Perl è anche un processo con il proprio ambiente.

0

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

Se è installato GDB, è possibile impostare/modificare variabili di shell genitore con il seguente trucco (stile non rigorosa viene utilizzato per chiarezza):

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

prova:

$ echo "$a $b" 

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

(basato su [C'è un modo per cambiare le variabili d'ambiente di un altro processo?] (Http://stackoverflow.com/questions/205064/è-ci-a-way-to-change-altro-processs-ambiente-variabili)) – mykhal

0

Ma sì! 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 come questo corre una forchetta per un ambiente Perl-solo-per-dump, ma in esecuzione dell'ambiente si legano Perl in modo sicuro e Data::Dumper è biblioteca da utilizzare per l'invio/memorizzazione e recuperare le variabili Perl.

Nota: Questo non si preoccupano di considerazioni di sicurezza: devi avere fiducia environment_defaults.sh allo stesso livello dello script Perl principale !!!

0

Questo può ora essere fatto con la Env::Modify module

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