与Mina和Capistrano的互动外壳

时间:2016-10-21 18:28:17

标签: bash shell ssh capistrano3 mina

Capistrano Doc说

http://capistranorb.com/documentation/faq/why-does-something-work-in-my-ssh-session-but-not-in-capistrano/#

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如何处理它。如果可以的话?

1 个答案:

答案 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。