当 运行 通过 ssh 命令时尊重 rbenv

Respect rbenv when running commands over ssh

我有一个无头 Ubuntu 18.04 虚拟机,我在 rbenv 上安装了一个 Rails 应用程序。

我希望能够自动执行一些管理操作,这样我就可以在本地 运行 它们并让我的脚本通过 ssh 执行命令。但是,当我这样做时,我得到的是系统 ruby 而不是 rbenv ruby。如果我直接 ssh 到盒子,那么我得到正确的 rbenv ruby.

示例:

ubuntu:~$ cat show-ruby.sh
which ruby
ruby --version
ubuntu:~$ bash show-ruby.sh
/home/ubuntu/.rbenv/shims/ruby
ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-linux]
laptop:~$ ssh ubuntu 'bash show-ruby.sh'
/usr/bin/ruby
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux-gnu]

rbenv 在我的 .bashrc 文件中初始化:

export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"

所以我尝试将 source ~/.bashrc 添加到我的 show-ruby.sh 测试脚本的顶部,但没有任何区别。有什么想法可以强制我的远程执行脚本遵守我安装的 rbenv ruby?

只需添加一个包含所需 ruby 版本的 .ruby-version 文件,rbenv 将自动设置 ruby 版本

[current] > cat .ruby-version
2.4.6
[current] > rbenv version
2.4.6 (set by .ruby-version)

rbenv 从 .bashrc 中安装的初始化中触发。但是,该初始化仅发生在交互式 shell 中。您可以强制 bash shell 与 -i 标志交互:

laptop:~$ ssh ubuntu 'bash -i show-ruby.sh'
/home/ubuntu/.rbenv/shims/ruby
ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-linux]