Capistrano Doc说
ssh me@remote "[[ $- == *i* ]] && echo 'Interactive' || echo 'Not interactive'"
Interactive
me@localhost $ ssh me@remote "shopt -q login_shell && echo 'Login shell' || echo 'Not login shell'"
Not login shell
Capistrano表示该命令在“交互式和非登录shell ”中的ssh me @ remote上运行。很好,但这是我的观点。
我做的是,我在 .bashrc 中添加了一个简单的测试,看起来像这样
echo $-
# If not running interactively, don't do anything
case $- in
*i*) echo 'Interactive';;
*) echo 'Non Interactive';;
esac
现在,我没有双引号("
)而是将Capistrano示例包装在单引号('
)中,因为我觉得双引号扩展了当前shell的表达式(在我的情况下,这是我的笔记本电脑tty
终端)
结果:
ssh me@remote '[[ $- == *i* ]] && echo "Interactive" || echo "Not interactive"'
hBc
Non Interactive
Not interactive
Question 1:
- Capistrano doc 是否正确?。看看上面的结果,似乎命令通过ssh在非交互式和非登录 shell中运行。
Question 2:
如果我是正确的(根据问题1)我如何在交互式shell中运行命令?我的印象是-t
选项会强制tty
分配,这会有所帮助。但这也无济于事。
ssh me@remote -t '[[ $- == *i* ]] && echo "Interactive" || echo "Not interactive"'
hBc
Non Interactive
Not interactive
Connection to remote closed.
Question 3:
现在提出原始问题。我正在使用Mina进行部署。现在,在mina部署期间,rvm永远不会加载。
原因我的bash在 bashrc
中有以下定义# bashrc
case $- in #when mina load bashrc it's a non-interactive shell.
*i*) ;;
*) return;;
esac
source ~/.rvm/scripts/rvm # this is never gets executed
Question 4(a)
人们如何解决这个问题?肯定在文件顶部移动rvm源负载帮助,但我寻找一个不同的答案。
Question 4 b
:Capistrano和Mina如何处理它。如果可以的话?
答案 0 :(得分:2)
我不使用RVM,但我会快速解决你的问题:
第一季度:除非我缺少另一篇文件,否则你引用错误。它说:默认情况下,Capistrano始终指定一个非登录的非交互式shell。
Q2:你不能/不应该。 Capistrano部署应完全无人值守,在这种情况下,不需要交互式shell。
问题3:这是我不确定的地方,因为我只使用过rbenv。不过我会试一试。使用https://github.com/capistrano/rvm设置RVM。完成后,如果除了此处列出的命令外还有一个命令:https://github.com/capistrano/rvm/blob/master/lib/capistrano/tasks/rvm.rake#L53,请使用append :rvm_map_bins, 'nameofexecutable'
使RVM适用于您的命令。
Q4a / b:见Q3。