#bash #shell #ssh #capistrano3 #mina
#bash #оболочка #ssh #capistrano3 #mina
Вопрос:
В документе 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