Я пытаюсь написать (как я думал, будет) простой скрипт bash, который будет:
- запустить virtualenv, чтобы создать новую среду за 1 доллар
- активировать виртуальную среду
- сделать еще кое-что (установить django, добавить django-admin.py к пути в virtualenv и т. д.)
Шаг 1 работает довольно хорошо, но я не могу активировать virtualenv. Для тех, кто не знаком с virtualenv, он создает activate
файл, который активирует виртуальную среду. Из CLI вы запускаете его, используяsource
source $env_name/bin/activate
Где $ env_name, очевидно, является именем директории, в которой установлен виртуальный env.
В моем сценарии после создания виртуальной среды я сохраняю путь к сценарию активации следующим образом:
activate="`pwd`/$ENV_NAME/bin/activate"
Но когда я звоню source "$activate"
, я получаю это:
/home/clawlor/bin/scripts/djangoenv: 20: source: not found
Я знаю, что он $activate
содержит правильный путь к скрипту активации, на самом деле я даже проверяю, есть ли файл перед вызовом source
. Но source
сам не могу найти его. Я также попытался выполнить все шаги вручную в CLI, где все работает нормально.
В своем исследовании я нашел этот сценарий , который похож на то, что я хочу, но также выполняет много других вещей, которые мне не нужны, например, хранение всех виртуальных сред в каталоге ~ / .virtualenv (или в любом другом месте). $ WORKON_HOME). Но мне кажется, что он создает путь activate
и призывает source "$activate"
в основном так же, как я.
Вот сценарий целиком:
#!/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
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Мой сценарий bash довольно слаб. Мне довольно удобно в CLI, но вполне может быть какая-то чрезвычайно глупая причина, по которой это не работает.
источник
В стандарте POSIX, который
/bin/sh
должен соблюдаться, команда.
(одна точка), а неsource
. Командаsource
- этоcsh
-изм, который был введенbash
.Пытаться
Или, если
bash
в вашем коде должны быть не-POSIX -измы, используйте#!/bin/bash
.источник
source
является синонимом.
./bin/sh -c '/path/to/script.sh'
. Несмотря на то, что мой сценарий был сценарием bash, источник не смог экспортировать экспорт. Но "." работал!В Ubuntu, если вы выполняете скрипт вместе с
sh scriptname.sh
вами, возникает эта проблема.Попробуйте
./scriptname.sh
вместо этого выполнить скрипт .источник
chmod +x filename.sh