mpa*_*pis 3 ruby bash shell awk zsh
我在ruby脚本中运行shell脚本作为子进程,运行脚本之后我想有一个选项来检查shell的所有环境变量,包括数组变量.
到目前为止,我想出了:
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;}
'
Run Code Online (Sandbox Code Playgroud)
哪个非常好只显示变量,包括数组,多行字符串和过滤函数.
但是这并不是一直使用相同的格式,尤其是数组变量在BASH和ZSH中的表示方式不同.
这是我目前的实现:https://github.com/mpapis/tf/blob/master/lib/tf/environment.rb
有一种简单的方法可以显示在BASH和ZSH /可能的其他shell中持久工作的所有变量.
很高兴再次见到你mpapis ;-)
不幸的是数组和关联数组没有被POSIX.1-2008覆盖,并且你已经发现之间存在一些恼人的细微差别bash和zsh.因此,没有一种方法可以在所有POSIX shell上执行此操作,我们需要检查$BASH_VERSION等等.
我决定最好避免编写Ruby来解析输出set或其他shell内置函数.输出不方便解析,无论如何shell都知道自己的数据,所以我认为将大部分智能放在shell代码中是有意义的.所以我提出了一个解决方案,它使用shell代码将数据结构输出为YAML,然后将YAML直接加载到Ruby中.
首先,我将您的参考实现和测试导入到独立存储库的master分支中.然后我加强了测试套件并进行了一些调整.这表明多线处理仍然存在问题.
然后我创建了一个新yaml分支并开发了自己的实现.我再次扩展了测试.他们都通;-)请注意,我用了几个不同的技巧来做到自省中zsh和bash:
zsh有一个zsh/parameter模块,提供包含其所有参数的名称和类型的关联数组.bash具有declare -p易于解析的形式.它也有compgen -A variable,但最后我没有使用它.我认为添加ksh支持也很容易.