PDA

Bekijk Volledige Versie : [Perl] system() or exec(), zonder return value ajb...



raqtweak.com
10/06/07, 14:35
Hallo allemaal,
even een PERL vraagje...

Ik heb een scriptje wat bepaalde commando's uitvoert, maar op het stukje code hieronder gaat het mis:


$retval = system("/usr/lib/mailman/bin/rmlist -a $list");
if($retval != 0) { $retval = system("/usr/lib/mailman/bin/rmlist $list"); }
if($retval != 0) { system("/bin/echo"); }

Dit is een stukje uit een foreach, dus daar haalt ie de $list value vandaan.

In principe zou dit moeten werken, echter: "rmlist -a" geeft een ERROR return terug als er geen archief gevonden is. Hij voert zijn taak wel uit, maar geeft een error return terug: perl script FAALT en exit.

Ik probeer dus nu het zo te maken dat ie:
rmlist -a --> geen archief? --> rmlist zonder -a --> anders doe niets

Dit werkt echter niet... exec heb ik ook geprobeerd, werkt ook niet echt.
Hij stopt gewoon na dat stukje code.

Enig idee hoe ik dit commando kan laten uitvoeren zonder een return value, zodat de plugin van hierboven niet faalt en alles met een SUCCESS afgerond wordt?

Mikey
10/06/07, 15:36
is het niet zo bij perl en exec dat op moment hij je een commando niet uit kan voeren je gelijk een or erachter kan zetten als tweede argument.



exec("/usr/lib/mailman/bin/rmlist -a $list") or exec("/usr/lib/mailman/bin/rmlist $list");


heb even snel voor je op perldoc nog zitten kijken
The exec function executes a system command and never returns-- use system instead of exec if you want it to return. It fails and returns false only if the command does not exist and it is executed directly instead of via your system's command shell (see below).

raqtweak.com
10/06/07, 15:44
heb even snel voor je op perldoc nog zitten kijken
The exec function executes a system command and never returns-- use system instead of exec if you want it to return. It fails and returns false only if the command does not exist and it is executed directly instead of via your system's command shell (see below).

Dat dacht ik dus ook, maar... blijkbaar faalt ie wel...

Mikey
10/06/07, 15:47
Dat dacht ik dus ook, maar... blijkbaar faalt ie wel...

bij falen kun je or gebruiken, dit is terug te vinden in perldoc (exec())

raqtweak.com
10/06/07, 16:43
bij falen kun je or gebruiken, dit is terug te vinden in perldoc (exec())

Dit heb ik ook geprobeerd, precies zoals jij zei... Maar, werkt niet. Haal ik alle exec()'s weg, werkt het...

AlexdePalex
10/06/07, 22:22
if ( ! system("/usr/lib/mailman/bin/rmlist -a $list") ) {
system("/usr/lib/mailman/bin/rmlist $list");
}

of


system("/usr/lib/mailman/bin/rmlist -a $list") &&
system("/usr/lib/mailman/bin/rmlist $list");


Maar als ik jou was, zou ik de eerste kiezen.

Alhoewel mij niet helemaal duidelijk is wat je nou met je return value bedoeld. Is dat de output of de exit value van je commando?

raqtweak.com
10/06/07, 22:28
Heb het uiteindelijk met:

my $remove = `command`;
opgelost... dat werkt wel...

Digiover
10/06/07, 22:33
In principe zou dit moeten werken, echter: "rmlist -a" geeft een ERROR return terug als er geen archief gevonden is. Hij voert zijn taak wel uit, maar geeft een error return terug: perl script FAALT en exit.

Letterlijk "ERROR"? Werkt iets als:


my $retval = `/usr/lib/mailman/bin/rmlist -a $list`;
if($retval == "ERROR") {
`/usr/lib/mailman/bin/rmlist $list`;
}
print "done\n";
Of geeft het commando een statuscode (0, 1, 99, 100) terug? In dat geval kan je de $? raadplegen, iets als:

my $retval = `/usr/lib/mailman/bin/rmlist -a $list`;
if($? == -1) {
`/usr/lib/mailman/bin/rmlist $list`;
}
print "done\n";
http://perldoc.perl.org/functions/system.html

//Edit: blijkbaar iets te lang met mn antwoord bezig geweest ;)

AlexdePalex
11/06/07, 02:30
Heb het uiteindelijk met:

my $remove = `command`;
opgelost... dat werkt wel...

???

Wat heb je nu gedaan dan? Laat het eens in de context zien.

almar
11/06/07, 13:13
de output van het commando komt in $remove, die kun je vervolgens uitlezen.

iets als if (!$remove) kun je vervolgens gebruiken om volgende acties uit te voeren.

AlexdePalex
11/06/07, 17:02
Almar. Ik begrijp wat die regel doet. Maar ik vraag mij af hoe hij de rest heeft opgelost. Daarmee bedoel ik:

- Wordt er gecontroleerd op de output van het commando?
- Wordt de exit code van het commando gebruikt.
- Hoe zien de condities van het if statement er uit?

In bovenstaande post heb ik termen voorbij zien komen die, IMHO, niet correct worden gebruikt. Het kan daarom zijn dat het nu toevallig werkt, maar dat zijn gekozen oplossing niet correct is. Vandaar mijn vraag hoe nu het hele stukje code eruit ziet.