Shelling out in Ruby



我正在尝试运行shell脚本,而不是处理Ruby代码,以匹配git log --stat命令结果中的一些正则表达式。我的外壳我可以运行以下程序:

$ if [[ ' 1 file changed, 2 insertions(+), 3 deletions(-)' =~ ([0-9]*).insertion ]]; then echo ${BASH_REMATCH[1]}; fi
2

但是,当我在Ruby(irb)中使用backticks:时

2.2.0 :001 > `if [[ ' 1 file changed, 2 insertions(+), 3 deletions(-)' =~ ([0-9]*).insertion ]]; then echo ${BASH_REMATCH[1]}; fi`
sh: 1: Syntax error: "(" unexpected (expecting "then")
 => ""

为了简化这个问题,我在shell中尝试了以下操作:

$ if [[ 'example' =~ am ]]; then echo 'match'; fi;
match

但是,当在Ruby中尝试时:

2.2.0 :001 > `if [[ 'example' =~ am ]]; then echo 'match'; fi;`
sh: 1: [[: not found
 => ""

如何处理([等特定字符?

可能值得一看ruby git gem可以做什么,但这里有一个ruby解决方案,可以在不必处理shell regexp的情况下读取输出。

IO.popen('git log --stat') do |io|
  while line = io.gets
    if line =~ /(d+) files changed, (d+) insertions..., (d+) deletions/
      files_changed = $1.to_i
      insertions = $2.to_i
      deletions = $3.to_i
      # Do something real here
    end
  end
end

最新更新