Получение ошибки «источник: не найден» при использовании источника в bash-скрипте - PullRequest
140 голосов
/ 22 марта 2009

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

  1. запустите virtualenv, чтобы создать новую среду за $ 1
  2. активировать виртуальную среду
  3. сделать еще кое-что (установить 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 сам не может его найти. Я также попытался выполнить все шаги вручную в интерфейсе командной строки, где все работает нормально.

В своем исследовании я нашел этот сценарий , который похож на то, что я хочу, но также выполняет много других вещей, которые мне не нужны, например, хранение всех виртуальных сред в ~ каталог /.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, но вполне может быть какая-то чрезвычайно глупая причина, по которой это не работает.

Ответы [ 3 ]

212 голосов
/ 22 марта 2009

Если вы пишете bash-скрипт, называйте его по имени:

#!/bin/bash

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

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

165 голосов
/ 22 марта 2009

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

Попробуйте

. $env_name/bin/activate

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

26 голосов
/ 21 сентября 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...