/ / Fehler 'Quelle: nicht gefunden' bei Verwendung der Quelle in einem Bash-Skript - bash, virtualenv

Fehler bei der Verwendung der Quelle in einem Bash-Skript - bash, virtualenv

Ich versuche zu schreiben (was ich dachte), ein einfaches Bash-Skript, das:

  1. Führen Sie virtualenv aus, um eine neue Umgebung mit $ 1 zu erstellen
  2. Aktivieren Sie die virtuelle Umgebung
  3. Mach mehr Sachen (installiere django, füge django-admin.py dem Pfad von virtualenv hinzu usw.)

Schritt 1 funktioniert ganz gut, aber ich kann nicht scheinen, den virtualenv zu aktivieren. Für diejenigen, die mit virtualenv nicht vertraut sind, schafft es einen activate Datei, die die virtuelle Umgebung aktiviert. Von der CLI aus führen Sie es mit source

source $env_name/bin/activate

Dabei ist $ env_name offensichtlich der Name des Verzeichnisses, in dem das virtuelle env installiert ist.

In meinem Skript speichere ich den Pfad zum Aktivierungsskript nach dem Erstellen der virtuellen Umgebung wie folgt:

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

Aber wenn ich anrufe source "$activate"Ich bekomme folgendes:

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

ich weiß das $activate enthält den korrekten Pfad zum Aktivierungsskript, tatsächlich teste ich sogar, dass eine Datei vorhanden ist, bevor ich anrufe source. Aber source selbst kann es scheinbar nicht finden. Ich habe auch versucht, alle Schritte manuell im CLI auszuführen, wo alles gut funktioniert.

In meiner Forschung fand ich Dieses Skript, was ähnlich ist wie ich will, aber auch istIch mache viele andere Dinge, die ich nicht brauche, wie das Speichern aller virtuellen Umgebungen in einem ~ / .virtualenv-Verzeichnis (oder was auch immer in $ WORKON_HOME ist). Aber es scheint mir, dass er den Pfad zu activateund rufen source "$activate" im Grunde genauso wie ich bin.

Hier ist das Skript in seiner Gesamtheit:

#!/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

HAFTUNGSAUSSCHLUSS: Mein Bash-Skript-Fu ist ziemlich schwach. Ich bin ziemlich zufrieden mit dem CLI, aber es kann durchaus ein extrem dummer Grund dafür sein, dass das nicht funktioniert.

Antworten:

183 für die Antwort № 1

Wenn Sie ein Bash-Skript schreiben, nennen Sie es namentlich:

#!/bin/bash

/ bin / sh ist nicht garantiert bash. Das hat vor einigen Jahren in Ubuntu eine Menge defekter Skripte verursacht (IIRC).

Die eingebaute Quelle funktioniert gut in bash; aber Sie könnten auch einfach Punkt wie Norman vorgeschlagen verwenden.


148 für die Antwort № 2

Im POSIX-Standard, der /bin/sh soll respektieren, das Kommando ist . (ein einzelner Punkt), nicht source. Das source Befehl ist a csh-ism, in den hineingezogen wurde bash.

Versuchen

. $env_name/bin/activate

Oder wenn Sie nicht POSIX haben müssen bash-isms in Ihrem Code verwenden #!/bin/bash.


22 für die Antwort № 3

In Ubuntu, wenn Sie das Skript mit ausführen sh scriptname.sh Du hast dieses Problem.

Versuchen Sie, das Skript mit auszuführen ./scriptname.sh stattdessen.