【问题标题】:exporting ruby variables to parent process将 ruby​​ 变量导出到父进程
【发布时间】:2014-07-10 07:43:14
【问题描述】:

我是红宝石新手。还在学习中。

我有 bash 脚本和一个 ruby​​ 脚本,各自负责。

bash 脚本使用一些命令行参数调用 ruby​​ 脚本。 ruby 脚本在解析这些命令行参数后将设置/取消设置它的一些本地变量。这些变量在父 bash 脚本中具有相同的用途/名称。

所以,我需要将 ruby​​ 脚本中变量的修改值也反映在父 bash 脚本中。

我想到的几种方法是:

1.) 将变量导出到 bash 中的环境,然后让 ruby​​ 使用 ENV[] 哈希修改它们。在这种情况下,不需要在 ruby​​ 中使用局部变量来存储这些值,ruby 会直接修改从 bash 导入的变量,因为它们是环境变量。但是,这些改变的环境值会反映在 bash 脚本中吗?

2.) 在 ruby​​ 脚本返回到父 bash 脚本后,调用 ruby​​ 的一些方法,这些方法会将 a 变量的值返回给它。因此,对于每个变量,都会调用一个方法。类似于 python 的东西,

python -c 'import python_module; print python_method()'

这在 ruby​​ 中可行吗?

如果以上两种都不可能,还有其他方法可以将 ruby​​ 变量的值反映回父 bash 脚本中吗?

或者,除了 ruby​​/python 之外,还有其他脚本选项可以帮助我做到这一点吗?

感谢您花时间阅读这篇文章并帮助我。 :-)

【问题讨论】:

    标签: python ruby linux bash environment


    【解决方案1】:

    最简单的机制类似于ssh-agent 程序使用的机制。

    让您的程序输出一组环境导出语句,例如

    export THIS=something
    export THAT=something_else
    

    然后让调用脚本eval得到结果,如

    eval `my_program`
    

    这将导致 shell 合并您的环境变量。例如,这是一个 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'
    

    所以当我评估结果时,导出语句由调用 shell 执行:

    airhead:Python sholden$ eval `python stackoflo.20140710-1.py`
    

    其设置的变量现在是环境的一部分:

    airhead:Python sholden$ echo $THIS
    something
    airhead:Python sholden$ echo $THAT
    something else
    

    最后,证明这些值确实进入了 shell 的环境:子 shell 可以看到它们。

    airhead:Python sholden$ bash
    bash-3.2$ echo $THIS
    something
    

    【讨论】:

    • 您好,感谢您的回复。 :-) 我确实尝试了你所说的,但它没有用。在运行 ruby​​ 脚本作为 bash 中 eval 的参数时,ruby 脚本中定义的环境变量不会反映在调用 bash 中。在谷歌上阅读 eval 时,我的理解是它给出了被调用命令的返回值。
    • 您会希望看到这个链接:stackoverflow.com/questions/2660571/… 没有任何方法可以让父进程看到子进程对环境变量所做的更改。在这种情况下,父进程是 bash 脚本的外壳,子进程是 ruby​​ 脚本的外壳。如果您可以提供一个使用 bash 和 ruby​​ 脚本的示例,类似于我所描述的,我将不胜感激。 :-)
    • 好的,我已经编辑了我的答案以包含一个简单的示例。
    • 感谢您提供的代码示例。它确实在一定程度上有所帮助。但是,这只有在没有任何 print/puts 语句具有除系统命令之外的字符串文字时才有效。在我的要求中,我需要有很多用于错误报告和其他调试信息的 puts 语句。因此,在使用 eval 命令时,系统会报告无效命令。但是,您提出的非常聪明的逻辑和想法。太棒了!
    猜你喜欢
    • 2011-10-24
    • 2022-01-25
    • 2021-08-22
    • 1970-01-01
    • 2017-04-21
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    • 1970-01-01
    相关资源
    最近更新 更多