2010-03-17 11 views
14

Sono nuovo di Perl e volete sapere di un modo per eseguire un comando esterno (lo chiamano prg) nei seguenti scenari:Come posso eseguire un comando esterno e catturarne l'output in Perl?

  1. Run prg, ottenere il suo unico stdout.
  2. Eseguire prg, solo il suo stderr.
  3. Eseguire prg, ottenere il suo stdout e stderr, separatamente.
+9

Fatti un grande favore e passa un po 'di tempo su perldoc.perl.org - per i principianti le aree "Tutorials" e "FAQs". Esegui anche questo per familiarizzare con il sistema di Perl per accedere alle informazioni di aiuto sulla riga di comando: 'perldoc --help'. La risposta alla tua domanda specifica potrebbe essere stata trovata direttamente da ricerche da riga di comando come queste: 'perldoc -q capture' o' perldoc -q external'. – FMc

+0

Si potrebbe voler esaminare 'qx', potrebbe avere modi per separare i flussi ed è facile da eseguire, ad es. 'qx (" command ");' –

risposta

25

È possibile utilizzare i backtics per eseguire il programma esterno e catturare la sua stdout e stderr.

Per impostazione predefinita i backticks scartare i stderr e restituire solo la stdout del program.So esterna

$output = `cmd`; 

catturerà l'stdout dei cmd programma e scartare stderr.

Per catturare solo stderr è possibile utilizzare descrittori di file della shell come:

$output = `cmd 2>&1 1>/dev/null`; 

Per catturare sia stdout e stderr si può fare:

$output = `cmd 2>&1`; 

utilizzando il sopra di voi non sarete in grado a differenciate stderr da stdout. Per separte stdout da stderr può reindirizzare sia in un file separato e leggere i file:

`cmd 1>stdout.txt 2>stderr.txt`; 
+2

Un altro modo per leggere separatamente stdout e stderr, senza usare file temporanei, è usare IPC :: Open3. – dave4420

+2

Ogni volta che si usano gli apici, un micetto muore. In shell, usa $(). In perl, usa qx. –

+0

Grazie per quello, ho ucciso 20 gattini prima di usare qx;) – Severun

8

Nella maggior parte dei casi è possibile utilizzare l'operatore di qx// (o backticks). Interpola le stringhe e le esegue con la shell, quindi puoi usare i reindirizzamenti.

  • Per catturare lo STDOUT di un comando (STDERR è invariato):

    $output = `cmd`; 
    
  • Per catturare STDERR di un comando e STDOUT insieme:

    $output = `cmd 2>&1`; 
    
  • Per catturare lo STDERR di un comando ma scartare il suo STDOUT (l'ordine è importante qui):

    $output = `cmd 2>&1 1>/dev/null`; 
    
  • Per scambiare lo STDOUT di un comando e STDERR al fine di catturare l'STDERR ma lasciare il suo STDOUT a venire fuori il vecchio STDERR:

    $output = `cmd 3>&1 1>&2 2>&3 3>&-`; 
    
  • Per leggere sia lo STDOUT di un comando e il suo STDERR separatamente, è più facile reindirizzarli su file separatamente, e poi leggere da questi file quando il programma è fatto:

    system("program args 1>program.stdout 2>program.stderr"); 
    
Problemi correlati