exec PROGRAM LIST
exec
funkcija atlieka sisteminę komandą ir niekada nieko negrąžina-- jei norima grąžinimo -- reiktų naudoti system
vietoj exec
. Iškvietimas nepavyksta ir grąžinamas false tik jei komanda neegzistuoja ir ji yra paleidžiama tiesiogiai, o ne per sistemos komandinį shell'ą (žr.apačioj).
Kadangi tai pakankamai dažna klaida - naudoti exec
vietoj
system
, Perl
įspėja, jei yra sakinių, kuriuose nėra die
,
warn
, ar exit
(jei yra užsetintas -w
- bet taip daroma visada). Jei tikrai
norima po exec
prirašyti kitų sakinių, galima išmėginti vieną šių variantų, kad išventumėte įspėjimo:
exec ('foo') or print STDERR "couldn't exec foo: $!";
{ exec ('foo') }; print STDERR "couldn't exec foo: $!";
Jei LIST'e yra daugiau negu vienas argumentas, arba jei LIST yra masyvas su daugiau nei viena reikšme, iškviesti execvp(3) su argumentais LIST'e. Jei yra tik vienas skalaras arba masyvas su vienu elementu jame, argumentas yra tikrinamas ir ieškoma shell'o metasimbolių, ir jei jų randama, visas argumentas perduodamas sistemos komandiniam shellui gramatiniam nagrinėjimui (parsinimui) (tai yra/bin/sh -c
Unixinėms platformoms ir gali būti įvairūs kitokie kitose platformose). Jei nėra shell'o metasimbolių argumente, jis išskaidomas į atskirus žodžius ir perduodamas tiesiai execvp
, kuris yra veiksmingesnis. Pavyzdžiai:
exec '/bin/echo', 'argumentai:', @ARGV;
exec "sort $outfile | uniq";
Jei tikrai nenorima vykdyti pirmojo arguemnto, bet siekiama sumeluoti vykdomai programai apie jos pačios pavadinimą, galima aprašyti programą, kurią iš tiesų norma atlikti, kad ji būtų paleidžiama kaip "netiesioginis objektas" (be kablelio) prieš LIST. (Tai visada priverčia interpretuoti LIST kaip daugiareikšmį sąrašą, net jei ten tėra tik vienintelis skaliaras.) Pavyzdys:
$shell = '/bin/csh';
exec $shell '-sh'; # Apsimeta kad tai login shell'as
ar labiau tiesiogiai,
exec {'/bin/csh'} '-sh'; # tas past
Kai argumentai vykdomi per sisteminį shell'ą, rezultatai bus keistumo ir galingumo klausimas. Žr. "`STRING`"
perlop'e dėl detalių.
Naudojant netiesioginį objektą su exec
arba system
yra ir saugiau. Šis panaudojimas (taip pat veikia ir su system()) priverčia interpretuot argumentus kaip daugiareikšmį sąrašą, net jei sąrašas turi tik vieną argumentą. Tokiu būdu apsisaugoma nuo shell'ą išplečiančių specialių simbolių ar žodžių skaidymo, kai juose yra tarpai.
@args = ( "echo surprise" );
exec @args; # išeina į shell'a
# jei @args == 1
exec { $args[0] } @args; # saugu net su vieno argumento sąrašu
Pirmoji versija, be netiesioginio objekto, paleido echo
programą, jai pateikdama "surprise"
argumentą. Antroji versija ne - ji mėgino paleisti programą tiesiog iškviesdama "echo surprise", jo nerado ir užsetino $?
nenulinę reikšmę, parodančią klaidą.
Pradedant su v5.6.0, Perl mėgins sujungt į vieną visus atidarytus failus išvedimui prie vykdant, bet tai gali būti nepalaikoma kai kuriose platformose (žr. perlport). Kad apsisaugotumėte, reikia užsetinti$|
($AUTOFLUSH
) arba iškviesti autoflush()
IO::Handle
metodą atidarytiems handle'ams kad išvengti išvedimo praradimo.
Pažymėtina, jogexec
neiškvies END
blokų, nei DESTROY
metodų objektuose.