2012-10-16 2 views
41

Sto chiamando molti script Perl nel mio script Bash (a volte anche da csh).Come verificare se uno script Perl non ha errori di compilazione?

All'inizio dello script Bash voglio mettere un test che controlli se tutti gli script Perl sono privi di errori di compilazione.

Un modo per farlo sarebbe chiamare effettivamente lo script Perl dallo script Bash e grep per "errore di compilazione" nel file di log in pipe, ma questo diventa disordinato quando diversi script Perl vengono chiamati in punti diversi del codice , quindi voglio farlo all'inizio dello script di Bash.

C'è un modo per verificare se lo script Perl non ha errori di compilazione?

risposta

59

Attenzione !!

Utilizzare il comando seguente per controllare gli errori di compilazione nel programma Perl può essere pericoloso.

$ perl -c yourperlprogram 

Randal ha scritto un bel articolo su questo argomento, che si dovrebbe verificare

Citando dal suo articolo :

Probabilmente il si la cosa più semplice che possiamo dire è "è valido?". Per questo, invochiamo Perl stesso, passando l'interruttore compilazione sola:

perl -c ourprogram 

per questa operazione, Perl compila il programma, ma termina poco prima della fase esecutiva. Ciò significa che ogni parte di del testo del programma viene convertita nella struttura interna dei dati che rappresenta il programma di lavoro, ma in realtà non è stato eseguito alcun codice da . Se ci sono errori di sintassi, veniamo informati, e la compilazione si interrompe.

In realtà, è un po 'una bugia. Grazie ai blocchi BEGIN (incluso il loro cugino stratificato, la direttiva use), alcuni codici Perl possono avere eseguito durante questo "controllo di sintassi" teoricamente sicuro. Ad esempio, se il codice contiene:

BEGIN { warn "Hello, world!\n" } 

poi si vedrà che il messaggio, anche durante perl -c! Ciò è in qualche modo sorprendente per le persone che considerano "solo compilato" per indicare "Esegui codice" solo per . Si consideri il codice che contiene:

BEGIN { system "rm", "-rf", "/" } 

e vedrete il problema con tale argomento. Ops.

+0

Grazie per avermi fatto conoscere i limiti del metodo. Btw, come devo canalizzare l'output perl -c? 'perl -c script.pl | grep "syntax OK" 'non funziona come previsto. Mi aspetto che non restituisca nulla quando contiene errori di compilazione. – user13107

+1

Non importa, capito! 'perl -c script.pl | & grep" sintassi OK "' – user13107

+0

È meglio controllare il valore di uscita effettivo, piuttosto che grep per qualche output di stringa. Il valore di uscita sarà 0 se ha successo, diverso da zero se fallisce il controllo. –

-1

Quando è necessario controllare gli errori/avvertenze prima di eseguire ma il file dipende in altri due file è possibile aggiungere l'opzione -I:

perl -I /path/to/dependency/lib -c /path/to/file/to/check 

Edit: da uomo perlrun

directory specificate da -I sono anteposta al percorso di ricerca per i moduli (@INC).