如何将shell脚本求值为Ruby哈希?

如何将shell脚本求值为Ruby哈希?,ruby,Ruby,我在一个名为a.sh的文件中有这个shell脚本: export A='a' export B=b export C=1 export D=$USER # say $USER is root 还有其他一些类似的文件b.sh、c.sh等 我需要从ruby脚本中读取shell文件,比如a.sh,并将其转换为ruby哈希: { 'A' => 'a', 'B' => 'b', 'C' => 1, 'D' => 'root' } 如何实现这一点?如果在ruby脚本之前运行ba

我在一个名为a.sh的文件中有这个shell脚本:

export A='a'
export B=b
export C=1
export D=$USER  # say $USER is root
还有其他一些类似的文件b.sh、c.sh等

我需要从ruby脚本中读取shell文件,比如a.sh,并将其转换为ruby哈希:

{ 'A' => 'a', 'B' => 'b', 'C' => 1, 'D' => 'root' }

如何实现这一点?

如果在ruby脚本之前运行bash脚本,则可以执行以下操作:

Hash[([ 'A', 'B', 'C', 'D' ] & ENV.keys).map {|x| [x, ENV[x]] }]
其中数组
['A','B','C','D']
包含用于创建
散列的有效变量名

如果需要在ruby中解析bash脚本,请执行以下操作:

vars = {}
IO.read('shell.sh').each do| line |
   if line =~ /^export\s([A-Za-z_][A-Za-z_0-9]*)=\s*(?:['"]([^'"]*)['"]|(.*))\s*$/
      (name, value) = [ $1, $2 || $3 ]
      value.gsub!( /\$(?:([A-Za-z_][A-Za-z_0-9]*)|{([^{}]+)})/ ) do| match |
         ENV[ match[1..-1] ]
      end
      vars[ name ] = value.gsub(/#.*/, '').strip
   end
end
vars
# => {"A"=>"a", "B"=>"b", "C"=>"1", "D"=>"malo"}

您的环境变量位于
ENV
常量中。很抱歉,我可能没有明确说明。在ruby脚本之前没有执行shell脚本,我需要阅读ruby脚本中的shell脚本。所以ENV还没有包含这些变量。@МаъСаъСъъ:我知道,标记标记很有趣,但请不要:)@МаъСъъъ谢谢你的回答。但那仍然不是我想要的。因为shell.sh可能是一个真正的shell脚本,所以我必须使用shell来解释它,然后从环境中获得结果。@Evani请决定否。您之前是否运行该脚本。