Ruby shell命令的输出与shell不同

时间:2016-02-19 01:22:11

标签: ruby shell

当我从终端运行时:

$ grep -rnw 'PageObjects::CompanySettings::InfoPage' spec/**/*_spec.rb  | cut -d: -f1 | uniq

它返回一个结果:

spec/features/admins/change_payment_method_spec.rb

当我运行此命令时(通知 InfoPage 现在 TeamPage

$ grep -rnw 'PageObjects::CompanySettings::TeamPage' spec/**/*_spec.rb  | cut -d: -f1 | uniq

我得到一个结果:

spec/features/team_page_spec.rb

现在,当我进入irb并使用反引号来调用shell命令时,我得到第二个命令(TeamPage)的输出,但第一个命令(InfoPage)没有输出。

2.1.6 :001 > `grep -rnw 'PageObjects::CompanySettings::InfoPage' spec/**/*_spec.rb  | cut -d: -f1 | uniq`
""
2.1.6 :002 > # No result ^^
2.1.6 :003 >   `grep -rnw 'PageObjects::CompanySettings::TeamPage' spec/**/*_spec.rb  | cut -d: -f1 | uniq`
"spec/features/team_page_spec.rb\n"
2.1.6 :004 > # One result, as expected!

任何人都可以帮我弄清楚这是为什么吗?

1 个答案:

答案 0 :(得分:1)

我注意到在您的第一个示例中,该文件嵌套了几个深度目录,并且您使用的是非标准**通配符。

我最好的猜测是你的交互式shell支持非标准通配符,但你的批处理shell不支持。

一种可能的解决方案是使用find而不是依赖shell通配符。另一种可能是使用Ruby,因为你已经在使用Ruby了。 (注意:grep是非常优化的,所以如果你有大量非常大的文件,Ruby可能会慢一些。)

# Ruby's Dir class does support **
Dir['spec/**/*_spec.rb'].select {|filename|
  File.open(filename) {|file|
    file.each_line.any? {|line|
      line.inlcude?('PageObjects::CompanySettings::InfoPage')
    }
  }
}

[UNTESTED]