Capistrano i zmienne środowiskowe

w pliku .profile ustawiłem kilka zmiennych środowiskowych, w przypadku zalogowania się przez ssh zmienne są dostępne, natomiast w przypadku deploya przez capistrano te zmienne nie są dostępne.

Po wielu poszukiwaniach (m.in. http://www.thinkplexx.com/learn/howto/security/ssh/setting-ssh-remote-host-environment-variables-interactive-shell) doszedłem do następujących rzeczy:

  • zmienne z .profile i .bash_profile są ładowane w interactive shell
  • zmienne z .bashrc powinny być dostępne w non-interactive shell (czyli w przypadku capistrano), ale ustawione w tym pliku zmienne nie są dostępne w trakcie deploya

W trakcie deploya potrzebuję dostępu do ustawionych zmiennych środowiskowych. Próbowałem wykonać polecenie source
niestety otrzymałem komunikat: source: not found
System operacyjny: FreeBSD

ssh twoj_host “echo $SHELL”
ssh twoj_host “source /dev/null”
ssh twoj_host “. /dev/null”

http://www.enseignement.polytechnique.fr/informatique/INF422/sh.html

(…)
. file The commands in the specified file are read and executed by the
shell. The return command may be used to return to the . com-
mand’s caller. If file contains any `/’ characters, it is used
as is. Otherwise, the shell searches the PATH for the file. If
it is not found in the PATH, it is sought in the current working
directory.
(…)

$ ssh [user]@[host] "echo $SHELL" /bin/bash $ ssh [user]@[host] "source /dev/null" $ ssh [user]@[host] ". /dev/null"

[code]$ cap shell

  • 2013-08-15 19:56:34 executing `[user]’
  • 2013-08-15 19:56:34 executing `shell’
    ====================================================================
    Welcome to the interactive Capistrano shell! This is an experimental
    feature, and is liable to change in future releases. Type ‘help’ for
    a summary of how to use the shell.

cap> printenv
[establishing connection(s) to [host]]

** [out :: [host]] PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin:/usr/local/bin:/home/[user]/bin
…[/code]

Z $ ssh [user]@[host] “echo $SHELL” to Ci źle napisałem, ponieważ $SHELL zostanie rozwiązane na /bin/bash przed połączeniem się via ssh. Zamień " na ’ .
/bin/bash - raczej na freebsd nie będziesz mieć basha w tym miejscu. Bash nie jest domyślnie instalowany we freebsd. Po instalacji z paczki lub portów zazwyczaj wyląduje w /usr/local/bin/bash. Wyjątkiem od tej reguły będzie sytuacja, gdy sam dodasz sobie symlink w /bin.

Sprawdź z jakiej powłoki korzysta użytkownik [user]@[host]. Obstawiam, że /bin/sh lub /bin/csh, ponieważ one są domyślne. Jeśli nie używasz basha to nie będzie oczywiście odczytywany przy starcie plik ~/.bashrc tylko np. ~/.shrc lub ~/.cshrc

mam basha zainstalowanego, użytkownik korzysta z basha, specjalnie wybiarłem basha jako domyślną powłokowe dla zwykłego użytkownika, bo sh działa trochę dziwnie jak dla mnie.

Masz rację bash jest w /usr/local/bin/bash ale na bin/bash mam ustawionego symlinka. Po wpisaniu w konsoli cap shell
zmienna shell ustawiona jest na /usr/local/bin/bash

W tym momencie te zmienne mam ustawione w default_environment ale przez to mam duplikację wpisów w pliku plikach do deploya i .profile. Plik .bashrc w ogóle nie jest odczytywany.

Jeżeli chcesz, aby capistrano odpalał powłokę w trybie “login”, spróbuj ustawić po prostu:

set :default_shell, "bash -l"