阅读红宝石所有shell变量(read all shell variables in ruby)

2019-09-21 04:50发布

问题:

我运行shell脚本在Ruby脚本子,行书后,我想有一个选项来检查外壳的所有环境变量,包括数组变量。

到目前为止,我想出了:

set | awk -F= 'BEGIN            {v=0;}
  /^[a-zA-Z_][a-zA-Z0-9_]*=/    {v=1;}
  v==1 && $2~/^['\''\$]/        {v=2;}
  v==1 && $2~/^\(/              {v=3;}
  v==2 && /'\''$/ && !/'\'\''$/ {v=1;}
  v==3 && /\)$/                 {v=1;}
  v                             {print;}
  v==1                          {v=0;}
'

这挺好的只显示了变量,包括数组,多行字符串滤除功能。

但是,这并不使用相同的格式,所有的时间,特别是数组变量在bash和ZSH不同的表示。

这是我目前的执行: https://github.com/mpapis/tf/blob/master/lib/tf/environment.rb

题:

有一个简单的方法来显示所有将在bash和ZSH /可能还有其他炮弹坚持工作的变量。

Answer 1:

很高兴再次见到你mpapis ;-)

不幸的是数组和关联数组没有被POSIX.1-2008覆盖 ,并且你已经发现之间存在一些恼人的细微差异bashzsh 。 所以在所有POSIX壳做到这一点没有单一的方式,我们需要检查$BASH_VERSION等因为你已经注意到。

我决定,这是更好地避免不必编写Ruby来解析的输出set或其他shell内置插件。 输出不方便解析,反正外壳知道最了解自己的数据,所以我想这是有道理的把大部分的智能shell代码内。 于是我又想出了一个解决方案 ,它使用shell代码输出数据结构YAML ,然后是YAML被直接加载到红宝石。

首先,我进口的参考实现和测试进入了master的独立存储库的分支 。 然后,我加强了测试套件,并提出了一些调整。 这表明,仍然有与多线处理问题。

然后,我创建了一个新yaml分支和发展我自己的实现。 我再次延长了测试。 他们都通;-)请注意,我用了几个不同的技巧来做到自省中zshbash

  • zsh具有zsh/parameter模块,它提供了一种含有其所有参数的名称和类型关联数组。
  • bash具有declare -p这是一种容易解析的形式。 它还compgen -A variable ,但最终我没有使用此。

我认为这将是很容易添加ksh支持了。



Answer 2:

set返回所有shell变量,而不是环境变量。 要获取环境变量,使用env命令。 需要注意的是bash的不阵列导出到环境。



文章来源: read all shell variables in ruby