为何脚本中source ~/.bashrc无法加载RVM,直接source RVM脚本却可行?
问题原因与解决办法
问题的核心是bash默认的.bashrc会判断当前是否为交互式shell,非交互式环境下会直接退出,跳过后续配置。
大多数Linux发行版的默认.bashrc开头都有类似这样的代码:
# 如果不是交互式shell,不执行任何操作 case $- in *i*) ;; *) return;; esac
你的场景里:
- 用
/bin/bash -lc启动的是非交互式登录shell(-l触发登录shell行为,-c执行命令属于非交互式模式) - 当ci脚本中执行
source ~/.bashrc时,当前shell环境是非交互式的,触发了上述判断里的return,导致你追加的rvm配置语句根本没被执行 - 而直接执行
source "$HOME/.rvm/scripts/rvm"时,跳过了.bashrc的交互式判断逻辑,所以能正常加载rvm
可选解决方式
- 将rvm的配置语句移到登录shell专属配置文件中,比如
~/.bash_profile或~/.profile(登录shell会自动读取这些文件,不受交互式判断影响) - 修改
.bashrc,把rvm的配置代码放到交互式判断逻辑的前面,确保非交互式环境下也能执行 - 继续在ci脚本中直接source rvm脚本,就像你已经验证有效的方式一样
内容的提问来源于stack exchange,提问作者Abhijit Sarkar
相关产品推荐
相关产品推荐

