我是新來的Perl,想知道的方式來運行一個外部命令(稱之爲prg
)在下列情況:如何在Perl中運行外部命令並捕獲其輸出?
- 運行
prg
,獲得它的唯一stdout
。 - 運行
prg
,僅得到其stderr
。 - 運行
prg
,分別得到它的stdout
和stderr
。
我是新來的Perl,想知道的方式來運行一個外部命令(稱之爲prg
)在下列情況:如何在Perl中運行外部命令並捕獲其輸出?
prg
,獲得它的唯一stdout
。prg
,僅得到其stderr
。prg
,分別得到它的stdout
和stderr
。您可以使用backtics來執行您的外部程序並捕獲它的stdout
和stderr
。
默認情況下,反引號丟棄stderr
並返回只有外部program.So
$output = `cmd`;
將捕獲程序CMD的stdout
並丟棄stderr
的stdout
。
只捕獲stderr
你可以使用shell的文件描述符:
$output = `cmd 2>&1 1>/dev/null`;
同時捕獲stdout
和stderr
你可以這樣做:
$output = `cmd 2>&1`;
使用上面你不能以從stdout
區分stderr
。爲了separte stdout
從stderr
既可以重定向到一個單獨的文件和讀取文件:
`cmd 1>stdout.txt 2>stderr.txt`;
在大多數情況下,你可以使用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");
幫你一個忙,並在perldoc.perl.org上花一些時間 - 爲初學者提供「教程」和「常見問題」區域。另外運行這個來熟悉Perl的系統以訪問命令行上的幫助信息:'perldoc --help'。您可以直接通過命令行搜索找到您的具體問題的答案,例如:perldoc -q capture或perldoc -q external。 – FMc 2010-03-17 12:19:41
您可能想要查看'qx',它可能有多種方法來分離流,並且很容易運行,例如, 'qx(「command」);' – 2014-09-25 19:39:28