2010-03-17 67 views
14

我是新來的Perl,想知道的方式來運行一個外部命令(稱之爲prg)在下列情況:如何在Perl中運行外部命令並捕獲其輸出?

  1. 運行prg,獲得它的唯一stdout
  2. 運行prg,僅得到其stderr
  3. 運行prg,分別得到它的stdoutstderr
+9

幫你一個忙,並在perldoc.perl.org上花一些時間 - 爲初學者提供「教程」和「常見問題」區域。另外運行這個來熟悉Perl的系統以訪問命令行上的幫助信息:'perldoc --help'。您可以直接通過命令行搜索找到您的具體問題的答案,例如:perldoc -q capture或perldoc -q external。 – FMc 2010-03-17 12:19:41

+0

您可能想要查看'qx',它可能有多種方法來分離流,並且很容易運行,例如, 'qx(「command」);' – 2014-09-25 19:39:28

回答

25

您可以使用backtics來執行您的外部程序並捕獲它的stdoutstderr

默認情況下,反引號丟棄stderr並返回只有外部program.So

$output = `cmd`; 

將捕獲程序CMD的stdout並丟棄stderrstdout

只捕獲stderr你可以使用shell的文件描述符:

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

同時捕獲stdoutstderr你可以這樣做:

$output = `cmd 2>&1`; 

使用上面你不能以從stdout區分stderr。爲了separte stdoutstderr既可以重定向到一個單獨的文件和讀取文件:

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

另一種單獨讀取stdout和stderr而不使用臨時文件的方式是使用IPC :: Open3。 – dave4420 2010-03-17 10:55:35

+2

每次使用反引號時,一隻小貓死亡。在shell中,使用$()。在Perl中,使用qx。 – 2010-03-17 15:40:51

+0

謝謝你,我在使用qx之前殺死了20只小貓;) – Severun 2014-02-21 02:12:08

8

在大多數情況下,你可以使用qx//運營商(或反引號)。它插入字符串並使用shell執行它們,因此您可以使用重定向。

  • 要捕獲一個命令的標準輸出(STDERR不受影響):

    $output = `cmd`; 
    
  • 要捕獲一個命令的STDERR和STDOUT在一起:

    $output = `cmd 2>&1`; 
    
  • 要捕獲一個命令的標準錯誤,但是卻丟棄其STDOUT(訂購在這裏很重要):

    $output = `cmd 2>&1 1>/dev/null`; 
    
  • ,以便捕捉到STDERR但離開其STDOUT出來老STDERR交換命令的STDOUT和STDERR:

    $output = `cmd 3>&1 1>&2 2>&3 3>&-`; 
    
  • 閱讀這兩個命令的標準輸出和單獨STDERR,最簡單的方法分別重定向他們的文件,然後從這些文件中讀取當程序進行:

    system("program args 1>program.stdout 2>program.stderr"); 
    
相關問題