exec PROGRAMMA LISTA
La funzione exec esegue un comando di sistema e non ritorna, usate
system invece di exec se volete che ritorni. Essa fallisce e
restituisce falso solo se il comando non esiste ed è eseguito
direttamente invece che tramite la shell dei comandi di sistema
(vedete qui sotto).
Poiché è un comune errore l'usare exec invece di
system, il Perl avvisa se non c'è un'istruzione che segue che
non sia die, warn o exit (se viene impostato -w, ma questo lo
si fa sempre). Se davvero si vuol far seguire exec con qualche altra
istruzione, per evitare l'avvertimento si può usare una di queste
modalità:
exec ('pippo') or print STDERR "pippo non puo` essere eseguito: $!";
{ exec ('pippo') }; print STDERR "pippo non puo` essere eseguito: $!";
Se ci fosse più di un argomento nella LISTA o se la LISTA è
un array con più di un valore, chiama execvp(3) con gli
argomenti della LISTA. Se c'è solo un argomento scalare o un array
con un solo argomento, l'argomento viene esaminato alla ricerca di
metacaratteri di shell e, se presenti, l'intero argomento viene passato
alla shell dei comandi del sistema per l'analisi sintattica (questa
è /bin/sh -c su piattaforme Unix ma può variare su altre
piattaforme). Se nell'argomento non ci sono metacaratteri di shell, esso
viene diviso in parole e passato direttamente a execvp che è
più efficiente.
Esempi:
exec '/bin/echo', 'I vostri argomenti sono: ', @ARGV;
exec "sort $file_in_output | uniq";
Se davvero non volete eseguire il primo argomento ma volete mentire al
programma che si sta eseguendo riguardo al proprio nome, potete
specificare il programma che si vuole realmente eseguire come un
"oggetto indiretto" (senza alcuna virgola) davanti alla LISTA
(Questo forza sempre l'interpretazione della LISTA come una lista
multivalore anche se c'è solo un singolo scalare nella lista).
Ad esempio:
$shell = '/bin/csh';
exec $shell '-sh'; # fa finta che sia una shell di login
oppure, più direttamente,
exec {'/bin/csh'} '-sh'; # fa finta che sia una shell di login
Quando gli argomenti vengono eseguiti attraverso la shell di sistema,
i risultati saranno soggetti ai sui cavilli e alle sue capacità.
Consultate perlop/"`STRING`" per i dettagli.
Usare un oggetto indiretto con exec o system è anche
più sicuro. Questo utilizzo (che funziona bene anche con
system()) forza l'interpretazione degli argomenti come fossero una
lista multivalore, anche se la lista avesse solo un argomento. In
questo modo siete al sicuro dalle wildcard [caratteri jolly, NdT]
di espansione della shell o dalla separazione delle parole che
contengono degli spazi.
@arg = ( "echo sorpresa" );
exec @arg; # soggetto agli escape della shell
# if @args == 1
exec { $arg[0] } @arg; # sicuro anche con una lista di un arogmento
La prima versione, quella senza l'oggetto indiretto, ha eseguito il
programma echo passandogli un argomento "sorpresa". La seconda
versione non l'ha passato, essa ha provato ad eseguire un programma
chiamato letteralmente "echo sorpresa", non l'ha trovato e ha
impostato $? ad un valore diverso da zero ad indicare il fallimento.
A partire dalla versione 5.6.0, il Perl cerca di terminare le operazioni
di I/O in corso su tutti i file aperti per l'output prima di eseguire
l'exec, ma questo potrebbe non essere supportato su alcune piattaforme
(consultate perlport). Per essere sicuri, dovreste impostare $|
($AUTOFLUSH nel modulo English) oppure chiamare il metodo autoflush()
di IO::Handle su ogni handle aperto, per evitare di perdere l'output.
Va notato che exec non chiamerà i vostri blocchi
END né invocherà nessun metodo DESTROY
nei vostri oggetti.