将 Ruby 变量导出到父进程

0 投票
1 回答
628 浏览
提问于 2025-04-18 12:45

我刚开始学习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 个回答

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

撰写回答