将 Ruby 变量导出到父进程
我刚开始学习Ruby,还是个新手。
我有一个bash脚本和一个Ruby脚本,它们各自负责不同的事情。
这个bash脚本会调用Ruby脚本,并传递一些命令行参数。Ruby脚本在解析这些命令行参数后,会设置或取消一些它自己用的变量。这些变量在父bash脚本中也会有相同的用途和名称。
所以,我需要在Ruby脚本中修改的变量值也能在父bash脚本中反映出来。
我想到几种方法:
1.) 在bash中将变量导出到环境中,然后让Ruby通过使用ENV[]
哈希来修改它们。这样的话,Ruby就不需要在本地存储这些值的变量,它可以直接修改从bash导入的环境变量。不过,这样修改的环境变量的值会在bash脚本中反映出来吗?
2.) 当Ruby脚本返回到父bash脚本后,调用一些Ruby的方法来返回变量的值给bash脚本。也就是说,每个变量都要调用一个方法。就像在Python中那样,
python -c 'import python_module; print python_method()'
在Ruby中可以做到吗?
如果以上两种方法都不可行,还有其他办法可以让Ruby变量的值在父bash脚本中反映出来吗?
或者,有没有其他的脚本选项,比如Ruby或Python以外的,可以帮助我实现这个目标?
感谢你花时间阅读这篇帖子并帮助我。:-)
1 个回答
最简单的方式就像是 ssh-agent
程序使用的那样。
你的程序可以输出一组环境变量设置的语句,比如:
export THIS=something
export THAT=something_else
然后让调用这个程序的脚本用 eval
来执行这些结果,就像这样:
eval `my_program`
这样做会让你的环境变量被当前的命令行环境所使用。例如,这里有一个简单的 Python 程序。
print "export THIS=something"
print "export THAT='something else'"
当我运行这个程序时,它会输出两个设置环境变量的语句:
airhead:Python sholden$ python stackoflo.20140710-1.py
export THIS=something
export THAT='something else'
所以当我用 eval 执行这些结果时,这些设置语句就会被调用的命令行环境执行:
airhead:Python sholden$ eval `python stackoflo.20140710-1.py`
这些变量现在已经成为环境的一部分:
airhead:Python sholden$ echo $THIS
something
airhead:Python sholden$ echo $THAT
something else
最后,这里有个证明,显示这些值确实进入了命令行环境:一个子命令行可以看到它们。
airhead:Python sholden$ bash
bash-3.2$ echo $THIS
something