Quiero llamar a "env.sh" desde "my_perl.pl" sin bifurcar una subcadena. Intenté con backtics y un sistema como este ->system (. env.sh)
[dot space env.sh], pero no funcionará. Por favor, ayúdame.cómo obtener un script de shell [variables de entorno] en el script de Perl sin forzar una subshell?
cómo obtener un script de shell [variables de entorno] en el script de Perl sin forzar una subshell?
Respuesta
Los entornos secundarios no pueden cambiar los entornos principales. Su mejor apuesta es analizar env.sh
desde dentro del código Perl y establecer las variables en %ENV
:
#!/usr/bin/perl
use strict;
use warnings;
sub source {
my $name = shift;
open my $fh, "<", $name
or die "could not open $name: $!";
while (<$fh>) {
chomp;
my ($k, $v) = split /=/, $_, 2;
$v =~ s/^(['"])(.*)\1/$2/; #' fix highlighter
$v =~ s/\$([a-zA-Z]\w*)/$ENV{$1}/g;
$v =~ s/`(.*?)`/`$1`/ge; #dangerous
$ENV{$k} = $v;
}
}
source "env.sh";
for my $k (qw/foo bar baz quux/) {
print "$k => $ENV{$k}\n";
}
Dado
foo=5
bar=10
baz="$foo$bar"
quux=`date +%Y%m%d`
imprime
foo => 5
bar => 10
baz => 510
quux => 20110726
El código sólo puede manejar archivos simples (por ejemplo, no maneja las declaraciones if
o foo=$(date)
). Si necesita algo más complejo, entonces escribir un contenedor para su script de Perl que ordene primero env.sh
es la forma correcta de hacerlo (también es probablemente la manera correcta de hacerlo en primer lugar).
Otro motivo para obtener env.sh
antes de ejecutar el script Perl es que la configuración de las variables de entorno en Perl puede ocurrir demasiado tarde para los módulos que esperan verlos.
En el archivo foo
:
#!/bin/bash
source env.sh
exec foo.real
donde foo.real es su script Perl.
Puede utilizar scripts de shell arbitrariamente complejos ejecutándolos con el shell relevante, volcando su entorno a la salida estándar en el mismo proceso y analizando eso en perl. Es prudente alimentar el resultado en algo que no sea% ENV o filtrar para valores de interés específicos, por lo que no cambia cosas como PATH que pueden tener efectos secundarios interesantes en otros lugares. He descartado la salida estándar y el error del script de shell generado, aunque podrían redirigirse a archivos temporales y utilizarse para la salida de diagnóstico en el script de Perl.
foo.pl:
#!/usr/bin/perl
open SOURCE, "bash -c '. foo.sh >& /dev/null; env'|" or
die "Can't fork: $!";
while(<SOURCE>) {
if (/^(BAR|BAZ)=(.*)/) {
$ENV{$1} = ${2} ;
}
}
close SOURCE;
print $ENV{'BAR'} . "\n";
foo.sh: BAR exportación = Baz
Prueba esto (ejemplo de código UNIX):
cd/tmp
vi s
#!/bin/bash
export blah=test
vi t
#!/usr/bin/perl
if ($ARGV[0]) {
print "ENV second call is : $ENV{blah}\n";
} else {
print "ENV first call is : $ENV{blah}\n";
exec(". /tmp/s; /tmp/t 1");
}
chmod 777 s t
./ T
ENV primera llamada es:
ENV segunda llamada es: Prueba
El truco está usando el ejecutivo a la fuente primera de su escritura del golpe y después de llamar a su script de perl de nuevo con un argumento tan u conocer que te están llamando por segunda vez.
- 1. Variables de entorno globales en un script de shell
- 2. ¿Cómo puedo generar variables de entorno para un shell de comandos en un script de Ruby?
- 3. ¿Cómo exportar una variable de shell dentro de un script de Perl?
- 4. Script fuente de shell en el entorno dentro de un script de ruby
- 5. Telnet dentro de un script de shell
- 6. ¿Cómo puedo averiguar qué script, programa o shell ejecutó mi script de Perl?
- 7. MySQL: Usar variables de entorno en el script
- 8. ¿Es posible obtener el código de salida de una subshell?
- 9. ¿Puedo recoger variables de entorno en el script vbscript WSH?
- 10. ¿Cómo ejecuto un script Perl desde un script Perl?
- 11. utilizando o en el script de shell script de
- 12. ¿Cómo imprimir el resultado del script de shell en CMake?
- 13. Exportación de variables entre el script de shell
- 14. Cómo obtener una contraseña de un script de shell sin repetir
- 15. ¿Cómo hacer un script de shell global?
- 16. ¿Cómo obtener el segundo último argumento del script de shell?
- 17. cómo usar un script de shell para supervisar un programa?
- 18. script de shell: if
- 19. Prueba de script Shell
- 20. Script BASH para pasar variables sin sustitución al nuevo script
- 21. de clasificación en shell script
- 22. Ejecutar un script de Perl en Windows sin extensión
- 23. ¿Cómo usar las variables de entorno de Windows en el script de Vim?
- 24. Entrada desde el script de shell
- 25. ¿Cómo puedo ejecutar el código de Perl almacenado dentro de una variable de script de shell?
- 26. Script de shell: compruebe la sintaxis
- 27. Prueba de un script de shell bash
- 28. ¿Obtener uso de CPU en script de shell?
- 29. Llamando al script de Perl desde PHP y pasando variables, al mismo tiempo usando el nombre de script perl variablizado
- 30. cómo leer solo un carácter en el script de shell
El uso de 'env' solo funciona si el script de shell exporta deliberadamente las variables. Si el script no los exporta específicamente, intente con 'set' en lugar de 'env'. – EdwinW