与shell相比,意外的Ruby输出?

时间:2014-06-25 20:40:36

标签: ruby

我正在编写一些Nagios插件并遇到了奇怪的问题。我不知道我是否遗漏了一些东西,但是在Ruby中执行的命令没有返回与shell相同的结果:

[root@myhost~]# pgrep -f ntpd | wc -l
1
[root@myhost~]# irb
irb(main):001:0> `pgrep -f ntpd | wc -l`
=> "2\n"
[root@myhost~]# ruby -v
ruby 1.8.7 (2011-06-30 patchlevel 352) [x86_64-linux]

按预期输出:

irb(main):009:0> `pgrep -f ntpd`.chomp
=> "23198"

根据the backticks documentation,该方法应该将命令的STDOUT作为字符串返回。

有什么想法吗?我觉得有一些我误解的基本原则。

1 个答案:

答案 0 :(得分:0)

正如文档所述,反引号returns the standard output of running cmd in a subshell.所以你看到的额外数字(2而不是1)是Ruby执行此命令的结果。

由于pgrep -f pattern将匹配完整命令,因此它还会计算执行pgrep的irb的结果。如果您在没有-f的情况下尝试,则会看到1

为了更好地了解幕后发生的事情,你可以用

搞乱
pgrep -f -l ntpd | wc -l && sleep 20

您应该看到类似额外sh的内容,对应于执行以下过程的irb:

sh -c pgrep -l -f ntpd && sleep 20