0

我需要在 Ruby 脚本中以编程方式设置 ruby​​ 版本 -> 执行捆绑程序 -> 和其他命令 [注意:不希望使用 shell 脚本执行此操作,它必须通过 ruby​​ 本身]。

由于默认情况下执行 ruby​​ 脚本/irb 使用“ sh ”,并且 RVM 使用“ bash/zsh ”,我设法使用 rvm & bash 使用以下命令设置 ruby​​ 版本 %x[bash -lc "rvm use #{ruby_ver}" 2>&1]

问题:在此之后,如果我运行任何系统命令(如 bundle install),它不会在我设置 ruby​​ 版本的同一个 bash shell 中执行,而是作为一个新 shell(再次考虑'sh'),因此执行环境与需要的不同。

即使在使用 运行更多命令时%x[bash -lc #{command}],它也会被视为不同的 shell。

有没有办法:在整个 ruby​​ 脚本执行期间将 shell 更改为 bash 或保留触发 RVM 的 shell 或任何更好的方法来处理这种情况

感谢任何帮助。

4

2 回答 2

0

你应该使用像 session( gem , sources ) 这样的东西,还有其他的 gem 可以做同样的事情,但是这个是最好的之一。

安装宝石:

gem install session

用它:

require 'session'
bash = Session::Bash.new

bash.execute( 'long_running_command.exe' ) do |out, err|
  logger << out if out
  elogger << err if err
end

我有一个使用会话来包装 rvm - rvm-with( gem , sources ) 的 gem。

于 2013-08-19T10:53:19.773 回答
0

每个 Ruby shellout 都发生在它自己的、离散的 shell 中。你也许可以做一些事情,比如使用 popen 生成一个 bash shell,然后将你的命令通过管道传递给它,但你所做的只是运行一个 bash 脚本。

您最好的选择是创建一个完整的 bash 脚本,然后rvm do在您选择的 RVM 环境的上下文中执行它以运行它。你可以从 ruby​​ 调用它,通过执行类似的rvm do 2.0.0 bundle install && rake东西,但归根结底,你是在谈论运行 shell 命令,所以你应该用 shell 语法来做。

于 2013-08-19T01:03:17.077 回答