如何在Perl中运行外部命令并捕获其输出?
问题描述:
我是新来的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