Подтвердить что ты не робот

Получение ошибки "источник: не найден" при использовании источника в bash script

Я пытаюсь написать (как я думал) простой bash script, который будет:

  • запустить virtualenv для создания новой среды по цене $1
  • активировать виртуальную среду
  • сделайте еще что-нибудь (установите django, добавьте django-admin.py в путь virtualenv и т.д.).

Шаг 1 работает неплохо, но я не могу активировать virtualenv. Для тех, кто не знаком с virtualenv, он создает файл activate, который активирует виртуальную среду. Из CLI вы запускаете его с помощью source

source $env_name/bin/activate

Где $env_name, очевидно, является именем каталога, в котором установлено виртуальное env.

В моем script после создания виртуальной среды я сохраняю путь к активации script следующим образом:

activate="`pwd`/$ENV_NAME/bin/activate"

Но когда я звоню source "$activate", я получаю следующее:

/home/clawlor/bin/scripts/djangoenv: 20: source: not found

Я знаю, что $activate содержит правильный путь к активации script, на самом деле я даже проверяю, что файл есть до того, как я позвоню source. Но сам source не может найти его. Я также попытался выполнить все шаги вручную в CLI, где все работает нормально.

В моих исследованиях я нашел этот script, который похож на то, что я хочу, но также выполняет множество других вещей, которые я не нужно, например, хранить все виртуальные среды в каталоге ~/.virtualenv(или что угодно в $WORKON_HOME). Но мне кажется, что он создает путь к activate и вызывает source "$activate" в основном так же, как и я.

Вот script в нем:

#!/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, но вполне может быть какая-то крайне глупая причина, по которой это не работает.

4b9b3361

Ответ 1

Если вы пишете bash script, вызовите его по имени:

#!/bin/bash

/bin/sh не гарантируется bash. Это вызвало тонну сломанных скриптов в Ubuntu несколько лет назад (IIRC).

Встроенный источник прекрасно работает в bash; но вы могли бы просто использовать точку, как предположил Норман.

Ответ 2

В стандарте POSIX, который должен соблюдаться /bin/sh, команда . (одна точка), а не source. Команда source представляет собой csh -ism, который был втянут в bash.

Try

. $env_name/bin/activate

Или, если в вашем коде должны быть не-POSIX bash -isms, используйте #!/bin/bash.

Ответ 3

В Ubuntu, если вы выполняете script с sh scriptname.sh, вы получаете эту проблему.

Попробуйте выполнить script с помощью ./scriptname.sh.