Получение "источника:ошибка "не найдено" при использовании исходного кода в скрипте bash
-
21-08-2019 - |
Вопрос
Я пытаюсь написать (то, что, как я думал, будет) простой скрипт bash, который будет:
- запустите virtualenv, чтобы создать новую среду за 1 доллар
- активируйте виртуальную среду
- сделайте еще кое-что (установите django, добавьте django-admin.py в путь к virtualenv и т.д.)
Шаг 1 работает довольно хорошо, но, похоже, я не могу активировать virtualenv.Для тех, кто не знаком с virtualenv, он создает activate
файл, который активирует виртуальную среду.Из командной строки вы запускаете его с помощью 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
сам, похоже, не может этого найти.Я также попробовал выполнить все шаги вручную в командной строке, где все работает нормально.
В ходе своего исследования я обнаружил этот сценарий, который похож на то, что я хочу, но также выполняет множество других вещей, которые мне не нужны, например, хранит все виртуальные среды в каталоге ~/.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 script-fu довольно слаб.Я довольно комфортно чувствую себя в CLI, но вполне может быть какая-то чрезвычайно глупая причина, по которой это не работает.
Решение
Если вы пишете bash-скрипт, назовите его по имени:
#!/bin/bash
/bin/sh не гарантированно будет bash.Это привело к появлению тонны неработающих скриптов в Ubuntu несколько лет назад (IIRC).
Встроенный исходный код просто отлично работает в bash;но с таким же успехом вы могли бы просто использовать точку, как предложил Норман.
Другие советы
В стандарте POSIX, который /bin/sh
предполагается уважение, команда - это .
(одна точка), а не source
.Тот Самый source
команда - это csh
-изм , который был втянут в bash
.
Попробуй
. $env_name/bin/activate
Или, если у вас должен быть не-POSIX bash
-измы в вашем коде, используйте #!/bin/bash
.
В Ubuntu, если вы выполните скрипт с помощью sh scriptname.sh
вы сталкиваетесь с этой проблемой.
Попробуйте выполнить скрипт с помощью ./scriptname.sh
вместо этого.