Ruby 使用rbenv&;rake任务中的bundler,bash外部

Ruby 使用rbenv&;rake任务中的bundler,bash外部,ruby,shell,rake,rbenv,Ruby,Shell,Rake,Rbenv,我试图使用rbenv(带插件)和bundler来防弹我们的一些rake任务。但是,命令的rbenv填充版本(例如,bundle)取决于是否首先运行此命令(通常在.bashrc或其等效文件中找到): 这将扩展到shell命令,使rbenv和插件在shell中正常工作。这也意味着在我的机器上的交互式bash shell中正常工作的rake任务通常不会工作,例如从/bin/sh或在另一台机器上调用 我想为rake中的shell调用一次,然后继续使用该shell调用rake中的其他命令。可能吗 如果不是

我试图使用rbenv(带插件)和bundler来防弹我们的一些rake任务。但是,命令的rbenv填充版本(例如,
bundle
)取决于是否首先运行此命令(通常在
.bashrc
或其等效文件中找到):

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

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

如果不是,我是否可以将一个shell生成的环境变量和shell函数串联复制到后续shell

还是留给我这样的东西

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

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

我也愿意接受“你做错了”的战略重置,模组躲避rvm和rbenv圣战

更新:

在回答@konsolebox下面的问题时,我可能希望在rake文件中使用的ruby函数可能如下所示:

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

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

您可能需要一个脚本来运行其他命令吗

#!/bin/sh
eval "$(rbenv init -)"
other commands
或者,是否希望有一个脚本可以接受要执行的参数:

#!/bin/sh
eval "$(rbenv init -)"
"$@"
你可以作为

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

这与我提到的
&&
选项大致相当吗?按照在每个shell上运行
rbenv init
的方法,我可以用ruby fn包装它,例如
def rbenv_sh(command)
,并保存额外的脚本文件。很抱歉,我不明白ruby fn有什么帮助。您不是在从shell运行命令吗?或许我不太懂。你能详细说明一下吗?如果
eval
运行多个错误时不会快速返回的命令,那么使用
&&
不会有太大区别,因为它只会考虑最后一个更改
$?
的命令。请注意,
&
仅当
$?
为0时才执行它前面的命令。@ClayBridges我也提出了一个建议。很好的建议,尽管
&
对我来说解析得更好。
sh script.sh other commands
chmod 755 script.sh
./script.sh other commands
@@rbenv_init = %x(rbenv init -)

def rbenv_sh(command)
     %x(#{@@rbenv_init}\n#{command})
end