2010-03-17 46 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"); 
    
相关问题