indietro

  • exec LISTA
  • 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.