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

StackOverflow https://stackoverflow.com/questions/670191

  •  21-08-2019
  •  | 
  •  

Вопрос

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top