2016-10-21 5 views
0

Capistrano Doc sagtInteractive Shell mit Mina und Capistrano

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

ssh [email protected] "[[ $- == *i* ]] && echo 'Interactive' || echo 'Not interactive'" 
Interactive 
[email protected] $ ssh [email protected] "shopt -q login_shell && echo 'Login shell' || echo 'Not login shell'" 
Not login shell 

Capistrano Zustand, dass der Befehl ausgeführt wird auf mich in @ Remote ssh "Interactive und Nicht-Login-Shell". Sehr gut, aber hier ist mein Punkt.

Was ich tat, ist, habe ich einen einfachen Test in meinem Bashrc die

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

nun so aussehen, statt doppelte Anführungszeichen (") ich das Capistrano Beispiel in einem einzigen Zitat eingewickelt ('), weil ich das doppelte Anführungszeichen fühlte den Ausdruck für den aktuell Shell erweitern (in meinem Fall ist es mein Laptop tty Terminal)

Ergebnis:

ssh [email protected] '[[ $- == *i* ]] && echo "Interactive" || echo "Not interactive"' 
hBc 
Non Interactive 
Not interactive 

Question 1: - Ist der Capistrano doc korrekt?. Wenn ich mein Ergebnis oben anschaue, scheint der Befehl über ssh ausgeführt zu werden, und zwar in nicht interaktiver und nicht logischer Shell.

Question 2: Wenn ich richtig bin (in Bezug auf Frage 1) wie kann ich einen Befehl in einer interaktiven Shell ausführen ?. Ich war unter dem Eindruck -t Optionen würden tty Allokation erzwingen und das würde helfen. Aber das hilft auch nicht.

ssh [email protected] -t '[[ $- == *i* ]] && echo "Interactive" || echo "Not interactive"' 
hBc 
Non Interactive 
Not interactive 
Connection to remote closed. 

Question 3: Zur ursprünglichen Frage jetzt. Ich benutze Mina für meine Deployment-Sachen. Nun, während mina deploy wird der rvm nie geladen. meine bash

Grund hat die folgenden Definitionen in 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) Wie die Menschen, um dieses Problem arbeiten ?. Sicherlich verschiebe ich die rvm-Source-Last am Anfang der Datei, aber ich suche nach einer anderen Antwort.

Question 4 b: Wie gehen Capistrano und Mina damit um? Wenn sie können?

+0

Es ist wie die verknüpften Dokumente sieht richtig sind: „Standardmäßig Capistrano weist immer eine nicht-Login, nicht-interaktive Shell.“ –

Antwort

2

Ich benutze RVM nicht, aber ich werde einen schnellen Sprung an Ihre Frage nehmen:

Q1: Wenn es ein weiteres Stück der Dokumentation ist, dass ich vermisst, sie habe falsch zitiert. Sie lautet:

Standardmäßig weist Capistrano immer eine nicht-interaktive, nicht interaktive Shell zu.

Q2: Sie können/sollten nicht. Capistrano entfaltet sollte vollständig unbeaufsichtigt sein, in diesem Fall ist keine interaktive Shell erforderlich.

Q3: Dies ist, wo ich bin nicht sicher, weil ich nur rbenv benutzt habe. Aber ich werde es versuchen. Verwenden Sie https://github.com/capistrano/rvm, um RVM einzurichten. Sobald Sie, dass, wenn Sie einen Befehl zusätzlich zu den hier aufgeführten haben: https://github.com/capistrano/rvm/blob/master/lib/capistrano/tasks/rvm.rake#L53, append :rvm_map_bins, 'nameofexecutable' verwenden, um Ihren Befehl zu machen RVM anzuwenden.

Q4a/b: Q3 See.

+0

Vielen Dank für mich zu korrigieren, aber ich bezog sich auf diesem Teil [http://capistranorb.com/documentation/faq/why-does-something-work-in-my-ssh-session-but-not-in-capistrano/# how-can-i-Check] (http://capistranorb.com/documentation/faq/why-does-something-work-in-my-ssh-session-but-not-in-capistrano/#how-can- ich überprüfe) – Viren