raz*_*z3r 9 perl command-line backticks
假设我想用我的脚本用反引号运行一个外部程序,同时我想捕获STDOUT和STDERR,但是在两个不同的变量中.我怎样才能做到这一点?如果我运行此脚本,请参阅...
my $cmd = `snmpwalk -v $version -c $community $hostname $oid`;
Run Code Online (Sandbox Code Playgroud)
...如果没有错误一切正常但是如果命令引发错误,则该错误将打印在命令行上,我不希望发生这种情况.我也想捕获错误.屏幕上无需打印任何内容.有任何想法吗?
Joe*_*ger 12
你不需要一直走到哪open3一步,IIRC只适用于你需要读写外部命令的时候,甚至还有其他方法.
对于你的问题,我建议使用Capture::Tiny,它可以从其块内运行的任何东西捕获(甚至发球)STDOUT和STDERR.例如,根据您的问题:
#!/usr/bin/env perl
use strict;
use warnings;
use Capture::Tiny qw/capture/;
...
my ($stdout, $stderr) = capture {
system ( "snmpwalk -v $version -c $community $hostname $oid" );
};
Run Code Online (Sandbox Code Playgroud)
另一个例子考虑这个功能代码:
#!/usr/bin/env perl
use strict;
use warnings;
use Capture::Tiny qw/capture/;
my ($stdout, $stderr) = capture {
system ( "echo 'hello'" );
system ( "date" );
warn "Arg1!";
};
print "STDOUT:\n$stdout";
print "STDERR:\n$stderr";
Run Code Online (Sandbox Code Playgroud)
刚刚给了我:
STDOUT:
hello
Mon Dec 19 23:59:06 CST 2011
STDERR:
Arg1! at ./test.pl line 11.
Run Code Online (Sandbox Code Playgroud)
使用反引号执行此操作的唯一方法是重定向到shell命令中的文件:
my $cmd = `snmpwalk -v $version -c $community $hostname $oid 2>error.dat`;
Run Code Online (Sandbox Code Playgroud)
如果要在脚本中捕获STDERR,则需要IPC :: Open3而不是反引号
在Perl常见问题解答中,您有不同的选项,具体取决于您希望如何进行:
http://perldoc.perl.org/perlfaq8.html#How-can-I-capture-STDERR-from-an-external-command%3f
| 归档时间: |
|
| 查看次数: |
8403 次 |
| 最近记录: |