Интерактивная оболочка с Mina и Capistrano

#bash #shell #ssh #capistrano3 #mina

#bash #оболочка #ssh #capistrano3 #mina

Вопрос:

В документе Capistrano говорится

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

 ssh me@remote "[[ $- == *i* ]] amp;amp; echo 'Interactive' || echo 'Not interactive'"
Interactive
me@localhost $ ssh me@remote "shopt -q login_shell amp;amp; echo 'Login shell' || echo 'Not login shell'"
Not login shell
  

В Capistrano указано, что команда выполняется на ssh me@remote в «Интерактивной оболочке без входа в систему«. Очень хорошо, но вот моя точка зрения.

Что я сделал, так это добавил простой тест в мой .bashrc, который выглядит следующим образом

 echo $-
# If not running interactively, don't do anything
case $- in
   *i*) echo 'Interactive';;
     *) echo 'Non Interactive';;
esac
  

Теперь вместо двойных кавычек ( " ) я заключил пример Capistrano в одинарные кавычки ( ' ), потому что я чувствовал, что двойные кавычки расширяют выражение для текущей оболочки (в моем случае это терминал моего ноутбука tty )

Результат :

 ssh me@remote '[[ $- == *i* ]] amp;amp; echo "Interactive" || echo "Not interactive"'
hBc
Non Interactive
Not interactive
  

Question 1: — Верен ли документ Capistrano ?. Глядя на мой результат выше, кажется, что команда выполняется через ssh, выполняемый в неинтерактивной оболочке без входа в систему.

Question 2: Если я прав (в терминах вопроса 1), как я могу запустить команду в интерактивной оболочке?. У меня сложилось впечатление, что -t опции принудительно tty выделят ресурсы, и это помогло бы. Но это тоже не помогает.

 ssh me@remote -t '[[ $- == *i* ]] amp;amp; 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. Похоже, что связанные документы верны: «По умолчанию Capistrano всегда назначает неинтерактивную оболочку без входа в систему».

Ответ №1:

Я не использую RVM, но я быстро отвечу на ваш вопрос:

Q1: Если нет другой части документации, которую я пропустил, вы неправильно процитировали. В ней говорится:

По умолчанию Capistrano всегда назначает неактивную оболочку для входа в систему.

Вопрос 2: Вы не можете / не должны. Развертывание Capistrano должно выполняться полностью без присмотра, и в этом случае нет необходимости в интерактивной оболочке.

Q3: Вот тут я не уверен, потому что я использовал только 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.

Комментарии:

1. Спасибо, что поправили меня, но я имел в виду эту часть http://capistranorb.com/documentation/faq/why-does-something-work-in-my-ssh-session-but-not-in-capistrano/#how-can-i-check