2009-03-21 1 views
102

Я пытаюсь написать (то, что я думал, что будет) простой Баш скрипт, который будет:Получение «источник: не найден» ошибка при использовании источника в Баш скрипт

  1. запустить virtualenv создать новая среда в $ 1
  2. активировать виртуальную среду
  3. сделать некоторые вещи (установить Джанго, добавьте django-admin.py в пути в virtualenv в и т.д.)

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

source $env_name/bin/activate 

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

В моем сценарии, после создания виртуальной среды, Я храню путь к сценарию АКТИВИРУЙТЕ так:

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

Но когда я называю source "$activate", я получаю это:

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

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

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

ОТКАЗ: Мой Баш скрипт-фу довольно слаб. Я довольно удобен в CLI, но вполне может быть какая-то крайне глупая причина, по которой это не работает.

ответ

168

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

#!/bin/bash 

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

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

+0

Это решение было изначально комментарий в ответе Нормана Рэмси. Поскольку это то, что на самом деле фиксировало проблему, я изменил это как «принятый ответ». –

+0

Правильный ответ - это не оружие Рамси. – Enzo

128

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

Попробуйте

. $env_name/bin/activate 

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

+1

Это исправление. (изменение/bin/sh в/bin/bash). По какой-то причине среда не активируется в CLI, когда скрипт заканчивается, но это небольшая проблема. –

+3

В соответствии с [Инструкция Bash] (https://www.gnu.org/software/bash/manual/html_node/Bash-Builtins.html#index-source) 'source' является синонимом' .'. –

+0

Спасибо за вашу помощь –

19

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

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

+0

У меня возникла ошибка сегментации при выполнении этого. –

+2

Большое спасибо, это решило проблему для меня. –

+0

Файл должен быть прав: 'chmod + x filename.sh' – Randy

Смежные вопросы