Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.

[Perl] Environment variabelen

Pagina: 1
Acties:

  • Evil_Kroki
  • Registratie: November 2006
  • Laatst online: 25-02-2024
Ik ben een script aan het schrijven dat andere scritps zou moeten starten.
Het probleem ligt erin dat er, vooraleer de andere scripts opgeroepen worden, een aantal environment variabelen moeten geladen worden... wat opnieuw door een script gedaan wordt.
Dus in het kort:
mijn main script moet eerst een script runnen dat een aantal environment variabelen zet, om daarna een volgend script te runnen. Maar dit laatste script zou dus toegang moeten hebben tot die environment variabelen.

Ik heb al wat testjes gedaan waarbij ik een script aanroep die een environment var zet, en die probeer ik dan uit te lezen in mijn main script , maar dit lukt niet echt
Perl:
1
2
3
4
$env_script = 'test.bat';
$out ='out.bat';
exec($env_script);
print "test_var = >$ENV{'test_var'}<\n";


in test.bat staat gewoon
code:
1
set test_var=blabla


en in out.bat staat
code:
1
set | findstr test_var > out.txt


wanneer ik dit uitvoer, is de output:
code:
1
2
3
4
5
D:\test>test.pl
D:\test>set test_var=blabla
test_var = ><
D:\test>set | findstr test_var > out.txt
D:\test>


en mijn out.txt is leeg :)

Weet iemand of dit uberhaupt mogelijk is?

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 16:14
Het probleem is dat als je een proces start, het een kopie van de environment van zijn parent process erft. Alle wijzigingen worden gemaakt in zijn lokale kopie en zijn alleen beschikbaar aan het proces zelf (en eventuele nieuwe child processes die je weer start in je script). Dit is overigens een heel bekend probleem; vrijwel iedereen die (shell) scripts schrijft loopt hier vroeger of later tegenaan. ;)

Als je in een shell script (in sh/ash/bash/etc. of csh/tcsh/etc.) een ander shell script aanroept, kun je dit probleem vaak omzeilen met een source commando (. in sh-achtige shells, source in csh-achtige shells) waarmee je een extern script in het huidige proces kunt uitvoeren. Maar daarmee kun je geen scripttalen mengen.

In principe is wat je wil dus helaas niet mogelijk, in ieder geval niet op een eenvoudige of nette manier. Als je doel is om instellingen te scheiden van je programma, zou je test.bat kunnen vervangen door een wrapper script, dat eerst alle variables instelt, en dan het echte programma aanroept. Andersom kan ook: je zet regels b.v. in de vorm "x=y" in een ini-bestand en leest dat in in je Perl script.

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Ik dacht eerst dat dit over unix ging, maar het gaat over windows.

Bij bat-bestandjes kan dit well, door "call bestand.bat" te gebruiken. Bij perl is dit niet mogelijk bij mijn weten, of je moet het .bat-bestand zelf gaan parsen.

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


  • Evil_Kroki
  • Registratie: November 2006
  • Laatst online: 25-02-2024
Wel, uiteindelijk moet dit op Solaris draaien.
Zowel het variable script als het startupscript zijn in bash. Enkel het aanroepscript is Perl.

Als ik dan dat variable script zou "sourcen" en daarna het startup script ook zou "sourcen", zou dit dan werken?

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 16:14
Je kunt alleen scripts van hetzelfde type "sourcen". Zoiets kan dus wel:
Bash:
1
2
3
#!/bin/sh
. env.sh
exec ./script.pl

(In dit geval voer je eerst het shell script uit, waarmee variabelen in je lokale environment ingesteld worden, waarna je het Perl script uitvoert, dat de environment met de juiste instellingen erft.)

Als je dit echter vanuit je Perl script wil doen, zoals in de topic start, dan kan het niet, aangezien je het sh-script niet in Perl kunt uitvoeren. (Vandaar mijn suggestie om de instellingen in een configuratiebestand te zetten en in Perl in te lezen).

Alternatief is natuurlijk dat je nog een sh-script maakt, dat eerst de environment instelt door een script te sourcen en daarna het Perl script aanroept. Dan kan eventueel ook het script met de environmental variables zelf zijn.