0

我正在尝试使用 rbenv(带有插件)和捆绑器来防弹我们的一些 rake 任务。但是,命令的 rbenv 垫片版本(例如bundle)取决于首先运行它(通常在.bashrc或其同等版本中找到):

eval "$(rbenv init -)"

这扩展到 shell 命令,使 rbenv 和插件在 shell 中正常工作。这也意味着在我的机器上的交互式 bash shell 中正常工作的 rake 任务通常不会工作,例如从 /bin/sh 或另一台机器上调用。

我想做的是在 rake 中为 shell 调用一次,然后继续使用该 shell 来调用 rake 中的其他命令。那可能吗?

如果不是,我可以将一个 shell 产生的变量和 shell 函数连续复制到后续的 shell 吗?

还是我留下了类似的东西

eval "$(rbenv init -)" && other_command

或者

rbenv exec bundle exec other_command

(后者似乎有自己的问题)。

我也对“你做错了”战略重置持开放态度,模数躲避 rvm 与 rbenv jihads。

更新:

在回答下面@konsolebox 的问题时,我可能想在我的 rake 文件中使用的 ruby​​ 函数可能看起来像这样:

def rbenv_sh(command)
    %x(eval "$(rbenv init -)" && #{command})
end

这将确保command它将在正确的 rbenv 上下文中运行,而不依赖于点初始化文件。我只是在寻找比这更好的东西。

4

1 回答 1

0

您是否可能需要脚本来运行其他命令?

#!/bin/sh
eval "$(rbenv init -)"
other commands

或者您是否想要一个可以接受要执行的参数的脚本:

#!/bin/sh
eval "$(rbenv init -)"
"$@"

你可以作为

sh script.sh other commands

或者

chmod 755 script.sh
./script.sh other commands

如果您愿意,甚至可以将该脚本放在 /usr/local/bin 中,以便使用 $PATH 进行搜索。

您也可以根据自己的喜好放置eval "$(rbenv init -)"在 ~/.profile 或 ~/.bashrc 之类的启动文件中,但我不确定这对其他非 ruby​​ 相关的应用程序是否安全。

更新:

如何首先将输出存储在变量中:

@@rbenv_init = %x(rbenv init -)

def rbenv_sh(command)
     %x(#{@@rbenv_init}\n#{command})
end
于 2013-09-19T16:40:51.533 回答