Próbuję napisać (tak mi się wydawało) prosty skrypt bash, który:
- uruchom virtualenv, aby utworzyć nowe środowisko za 1 USD
- aktywuj środowisko wirtualne
- zrób więcej rzeczy (zainstaluj django, dodaj django-admin.py do ścieżki virtualenv itp.)
Krok 1 działa całkiem dobrze, ale nie mogę aktywować virtualenv. Dla tych, którzy nie są zaznajomieni z virtualenv, tworzy activate
plik, który aktywuje wirtualne środowisko. Z CLI uruchamiasz go za pomocąsource
source $env_name/bin/activate
Gdzie $ env_name, oczywiście, jest nazwą katalogu, w którym wirtualne env jest zainstalowane.
W moim skrypcie po utworzeniu środowiska wirtualnego przechowuję ścieżkę do skryptu aktywacyjnego w następujący sposób:
activate="`pwd`/$ENV_NAME/bin/activate"
Ale kiedy dzwonię source "$activate"
, dostaję to:
/home/clawlor/bin/scripts/djangoenv: 20: source: not found
Wiem, że $activate
zawiera poprawną ścieżkę do skryptu aktywacji, w rzeczywistości nawet sprawdzam, czy plik jest tam, zanim zadzwonię source
. Ale source
wydaje się, że sam nie może tego znaleźć. Próbowałem też uruchomić wszystkie kroki ręcznie w CLI, gdzie wszystko działa dobrze.
W swoich badaniach znalazłem ten skrypt , który jest podobny do tego, co chcę, ale robi również wiele innych rzeczy, których nie potrzebuję, takich jak przechowywanie wszystkich środowisk wirtualnych w katalogu ~ / .virtualenv (lub czymkolwiek jest w $ WORKON_HOME). Ale wydaje mi się, że tworzy ścieżkę activate
i woła source "$activate"
w zasadzie tak samo jak ja.
Oto cały skrypt:
#!/bin/sh
PYTHON_PATH=~/bin/python-2.6.1/bin/python
if [ $# = 1 ]
then
ENV_NAME="$1"
virtualenv -p $PYTHON_PATH --no-site-packages $ENV_NAME
activate="`pwd`/$ENV_NAME/bin/activate"
if [ ! -f "$activate" ]
then
echo "ERROR: activate not found at $activate"
return 1
fi
source "$activate"
else
echo 'Usage: djangoenv ENV_NAME'
fi
ZRZECZENIE SIĘ: Mój skrypt-fu bash jest dość słaby. Czuję się dość dobrze w CLI, ale może być jakiś wyjątkowo głupi powód, dla którego to nie działa.
źródło
W standardzie POSIX, który
/bin/sh
ma przestrzegać, polecenie to.
(pojedyncza kropka), a niesource
. Tosource
polecenie jestcsh
-izmem, w który został wciągniętybash
.Próbować
Lub jeśli musisz mieć
bash
w swoim kodzie -izmy inne niż POSIX , użyj#!/bin/bash
.źródło
source
jest synonimem.
./bin/sh -c '/path/to/script.sh'
. Mimo że mój skrypt był skryptem bash, źródło nie mogło pobrać eksportu. Ale "." zadziałało!W Ubuntu, jeśli wykonasz skrypt za pomocą
sh scriptname.sh
, pojawi się ten problem../scriptname.sh
Zamiast tego spróbuj wykonać skrypt za pomocą .źródło
chmod +x filename.sh