2010-03-17 19 views
14

Ben Perl yeniyim ve harici bir komutu çalıştırmak için bir yol biliyor istiyorum aşağıdaki senaryolarda (o prg call):Harici bir komutu nasıl çalıştırabilirim ve çıkışını Perl'de nasıl yakalayabilirim?

  1. Run prg, onun stdout sadece olsun.
  2. prg'u çalıştırın, yalnızca stderr ürününü edinin.
  3. prg'u çalıştırın, stdout ve stderr'u ayrı olarak alın.
+9

Kendinize büyük bir iyilik yapın ve perldoc.perl.org'da biraz zaman geçirin - yeni başlayanlar için "Öğreticiler" ve "SSS" alanları. Ayrıca, Perl'in komut satırındaki yardım bilgilerine erişmek için sisteme alıştırmak için bunu çalıştırın: "perldoc --help". Özel sorunuzun cevabı aşağıdaki gibi komut satırı aramaları tarafından doğrudan bulunabilir: "perldoc -q capture" veya "perldoc -q external". – FMc

+0

'qx'’ye bakmak isteyebilirsiniz, akışları ayırmanın yolları olabilir ve çalıştırılması kolaydır. 'qx (" komut ");' –

cevap

25

veya dış programını yürütmek ve yakalamak için backtics kullanabilirsiniz onun stdout ve stderr.

Varsayılan olarak backticks stderr atmak ve sadece stdout programı cmd içinde stdout yakalamak ve stderr atmak Will dış program.So

$output = `cmd`; 

döndürebilir. Yapabileceğiniz stderr hem stdout yakalamak için

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

ve:

siz Shell'in dosya tanımlayıcıları kullanabilirsiniz sadece stderr yakalamak için

$output = `cmd 2>&1`; 

Yukarıdaki mümkün olmayabilir olacak Kullanılması stdout'dan stderr farklılaştırmak için. separte için stderr den stdout ayrı dosyaya hem yönlendirmek ve dosyaları okuyabilir:

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

Geçici dosyaları kullanmadan, stdout ve stderr öğelerini ayrı ayrı okumanın bir başka yolu da IPC :: Open3'ü kullanmaktır. – dave4420

+2

Her backtick kullanıldığında, bir yavru kedi ölür. Kabukta, $() kullanın. Perl'de qx kullanın. –

+0

Bunun için, qx kullanmadan önce 20 yavru öldürdüm;) – Severun

8

Çoğu durumda qx// operatörü (ya komutu ters tırnak) kullanabilir. Dizeleri enterpoze eder ve bunları kabuk ile yürütür, böylece yönlendirmeleri kullanabilirsiniz.

  • komutun STDOUT yakalamak için (STDERR etkilenmez):

    $output = `cmd`; 
    
  • birlikte bir komutun STDERR ve STDOUT yakalamak için:

    $output = `cmd 2>&1`; 
    
  • komutun STDERR yakalamak ancak silmek için STDOUT (sipariş vermek burada önemlidir):

    $output = `cmd 2>&1 1>/dev/null`; 
    
  • eski STDERR STDERR yakalamak ama çıkıp onun STDOUT bırakabilmek için, bir komutun STDOUT ve STDERR alışverişi için:

    $output = `cmd 3>&1 1>&2 2>&3 3>&-`; 
    
  • komutun STDOUT ve ayrı ayrı kendi STDERR hem okumak için, en kolay yöntem Program bittiğinde bu dosyaların okuma sonra dosyalara ayrı olarak yönlendirmek ve:

    system("program args 1>program.stdout 2>program.stderr"); 
    
İlgili konular