2009-04-17 7 views
7

Se ho questa applicazione perl:Come svuotare l'output nei backtick In Perl?

print `someshellscript.sh`; 

che stampa mucchio di roba e richiede molto tempo per completare, come posso stampare che la produzione nel mezzo di esecuzione dello script di shell?

Sembra che Perl stamperà solo il risultato di someshellscript.sh al termine, c'è un modo per rendere l'output a livello di esecuzione?

risposta

16

Ciò che probabilmente si vuole fare è qualcosa di simile:

open(F, "someshellscript.sh|"); 
while (<F>) { 
    print; 
} 
close(F); 

Questo esegue someshellscript.sh e apre una pipe che legge l'output. Il ciclo while legge ogni riga di output generata dallo script e la stampa. Vedere la pagina di documentazione open per ulteriori informazioni.

+4

L'unica cosa che vorrei aggiungere è che di solito è meglio usare un filehandle lessicale: apri my $ fh, "someshellscript.sh |" o muori $ !; – friedo

+0

perché è meglio? –

+3

@Nathan: (1) Non è possibile clobber accidentalmente un filehandle esistente in un ambito contenente; (2) Un filehandle lessicale verrà automaticamente chiuso quando tutti i riferimenti al filehandle scompaiono (di solito all'uscita dall'ambito). –

3

Il problema qui è che l'escape con i backtick memorizza lo script in una stringa, che viene quindi stampata. Per questo motivo, non ci sarebbe modo di "svuotare" con la stampa.

Utilizzando il comando() sistema dovrebbe stampare l'output in modo continuo, ma non sarà in grado di catturare l'output:

system "someshellscript.sh"; 
+0

+1. EDIT: ho aggiunto una rapida dimostrazione di system() e ho cancellato la mia risposta che era altrimenti ridondante. –