如何将系统命令的结果存储在Perl变量中?

时间:2010-10-04 11:06:23

标签: perl command system

$ cat test.pl
my $pid = 5892;
my $not = system("top -H -p $pid -n 1 | grep myprocess | wc -l");
print "not = $not\n";
$ perl test.pl
11
not = 0
$

我想将结果即11捕获到变量中。我怎么能这样做?

6 个答案:

答案 0 :(得分:47)

来自Perlfaq8

你混淆了system()backticks(``)的目的。 system()运行命令并返回退出状态信息(作为16位值:低7位是进程死亡的信号,如果有的话,高8位是实际退出值)。反引号(``)运行命令并返回它发送给STDOUT的内容。

$exit_status   = system("mail-users");
    $output_string = `ls`;

有许多方法可以从Perl执行外部命令。最常见的含义是:

  • system() :您想要执行命令而不想捕获其输出
  • exec :你不想回到 调用perl脚本
  • backticks :你想抓住 输出命令
  • open您想要管道命令(如 输入或输出到您的脚本

另见How can I capture STDERR from an external command?

答案 1 :(得分:10)

最简单的方法是在Perl中使用``功能。这将执行内部的内容并返回打印到stdout的内容:

 my $pid = 5892;
 my $var = `top -H -p $pid -n 1 | grep myprocess | wc -l`;
 print "not = $var\n";

这应该这样做。

答案 2 :(得分:7)

尝试使用qx{command}而不是反引号。对我来说,它更好一点,因为:你可以用它做SQL而不用担心转义引号等。根据编辑器和屏幕的不同,我的老眼睛往往会错过微小的背嘀嗒声,并且不应该像使用尖括号而不是全局那样过载。

答案 3 :(得分:2)

使用backtickqx帮助,感谢大家的答案。但是,我发现如果您使用backtickqx,则输出包含尾随换行符,我需要将其删除。所以我使用了chomp

chomp($host = `hostname`);
chomp($domain = `domainname`);
$fqdn = $host.".".$domain;

更多信息: http://irouble.blogspot.in/2011/04/perl-chomp-backticks.html

答案 4 :(得分:1)

对系统命令使用反引号,这有助于将结果存储到Perl变量中。

我的$ pid = 5892; 我的$ not =``top -H -p $ pid -n 1 | grep myprocess | wc -l`; 打印“ not = $ not \ n”;

答案 5 :(得分:0)

也例如。你可以使用IPC::Run

use IPC::Run qw(run);

my $pid = 5892;
run [qw(top -H -n 1 -p), $pid],
    '|', sub { print grep { /myprocess/ } <STDIN> },
    '|', [qw(wc -l)],
    '>', \my $out;

print $out;
  • 进程在没有 bash 子进程的情况下运行
  • 可以通过管道传输到 perl subs
  • 非常类似于shell