2010-06-03 21 views
5

Tengo un script de shell, con una lista de variables de shell, que se ejecuta antes de ingresar a un entorno de programación.¿Cómo exportar una variable de shell dentro de un script de Perl?

Quiero usar un script Perl para entrar en el entorno de programación:

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

Pero cuando entro en el entorno de las variables no están ajustadas.

+0

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

Respuesta

2

Se llamarán diferentes procesos sh -c y las variables de entorno estarán aisladas dentro de estos.

¿No llama también a environment_defaults.sh también hacer otro proceso sh en el que estas variables se establecerán de forma aislada?

O inicie la secuencia de comandos Perl con estas variables de entorno exportadas y se establecerán para todos sus procesos secundarios.

9

Cuando llama a su segundo comando, no se hace en el entorno que modificó en el primer comando. De hecho, hay es sin ambiente restante del primer comando, porque el shell utilizado para invocar "environment_defaults.sh" ya ha salido.

Para mantener el contexto de la primera orden en la segunda, invocarlos en el mismo shell:

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

Tenga en cuenta que es necesario invocar el script de shell con source con el fin de llevar a cabo sus acciones en el shell actual, en lugar de invocar un nuevo shell para ejecutarlos.

Alternativamente, modificar su entorno al comienzo de cada shell (por ejemplo, con .bash_profile, si se utiliza bash), o hacer cambios variable de entorno en Perl sí:

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

esto no funciona como environment_defaults.sh hará que sea propio hijo sub-ejemplo –

+0

Thnks, me probará la primera opción. Las otras dos opciones son las que estoy tratando de evitar. – lamcro

+0

@Imre: cierto, si uno simplemente ejecuta el script, se invocará un nuevo shell. Use 'fuente' para ejecutar los comandos en el mismo shell (respuesta actualizada). – Ether

2

Cada proceso tiene su propio medio ambiente, y cada vez que llamas a "sistema" ejecuta un nuevo proceso. Entonces, lo que estás haciendo no funcionará. Tendrás que ejecutar ambos comandos en un solo proceso.

Tenga en cuenta, sin embargo, que una vez que su script Perl existe, las variables de entorno que establece no estarán disponibles para usted en la línea de comandos, porque su script Perl también es un proceso con su propio entorno.

0

(ACTUALIZACIÓN: Oh, esto no es exactamente lo que pidieron, pero podría ser útil para alguien.)

Si se instala GDB, se puede establecer/modificar las variables de shell padre con este truco (estilo no estricto se utiliza para mayor claridad):

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

prueba:

$ echo "$a $b" 

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

(basado en [¿Hay alguna manera de cambiar las variables de entorno de otro proceso?] (Http://stackoverflow.com/questions/205064)/is-there-a-way-to-change-another-processs-environment-variables)) – mykhal

0

Pero sí! ¡Puede ser!

#!/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 poco exageración ya que corre un tenedor para un entorno de Perl de sólo-a-volcado, pero el funcionamiento de entorno se unen Perl de una manera segura y Data::Dumper es la biblioteca a utilizar para el envío/almacenamiento y recuperando las variables de Perl.

Nota: Esto no se preocupan por consideraciones de seguridad: hay que confiar en environment_defaults.sh al mismo nivel que el script principal Perl !!!

0

Esto ahora se puede hacer 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"); 
Cuestiones relacionadas