Отримання помилки "source: not found" під час використання source у скрипті bash


159

Я намагаюся написати (що я думав, що це буде) простий скрипт, який буде:

  1. запустіть virtualenv, щоб створити нове середовище за 1 долар
  2. активувати віртуальне середовище
  3. зробити ще деякі речі (встановити django, додати 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, де все працює добре.

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

Відповіді:


230

Якщо ви пишете bash-скрипт, називайте його по імені:

#!/bin/bash

/ бін / ш не гарантовано буде баш. Це спричинило багато зламаних сценаріїв в Ubuntu кілька років тому (IIRC).

Вбудований джерело працює просто чудово; але ви можете просто використовувати крапки, як запропонував Норман.


Спочатку це рішення було коментарем у відповіді Нормана Рамзі. Оскільки саме це і вирішило проблему, я змінив це на «прийняту відповідь»
Кріс Лоулер

185

У стандарті POSIX, який /bin/shповинен поважати, команда є .(одна крапка), а не source. sourceКоманда є cshізми , який був витягнутий в bash.

Спробуйте

. $env_name/bin/activate

Або якщо bashу вашому коді повинні бути не POSIX -изми, використовуйте #!/bin/bash.


1
Це виправляє. (зміна / bin / sh на / bin / bash). Чомусь середовище не активується в CLI, коли сценарій закінчується, але це незначна проблема.
Кріс Лоулор

8
Відповідно до посібника Bash source це синонім для ..
Річард Хансен

1
Я натрапив на це при використанні Docker контейнера з EntryPoint , як це, /bin/sh -c '/path/to/script.sh'. Незважаючи на те, що мій сценарій був баш сценарієм, джерело не вдалося отримати джерело експорту. Але "." працювали!
Nikhil Owalekar

31

Якщо ви виконаєте скрипт в Ubuntu, sh scriptname.shви отримаєте цю проблему.

Спробуйте виконати сценарій за допомогою ./scriptname.sh.


У мене виникла помилка сегментації.
макс-чиститель

1
Файл повинен бути виконаним:chmod +x filename.sh
Ренді

2
Будь-яка ідея, чому це?
Юваль Адам

Єдине, що працювало на моєму Ubuntu 20.04
Kirill_Zaitsev
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.