Ich versuche (wie ich dachte) ein einfaches Bash-Skript zu schreiben, das:
- Führen Sie virtualenv aus, um eine neue Umgebung für 1 US-Dollar zu erstellen
- Aktivieren Sie die virtuelle Umgebung
- Mach noch ein paar Sachen (installiere django, füge django-admin.py zum Pfad des virtualenv hinzu usw.)
Schritt 1 funktioniert ganz gut, aber ich kann die virtuelle Umgebung scheinbar nicht aktivieren. Für diejenigen, die mit virtualenv nicht vertraut sind, wird eine activate
Datei erstellt, die die virtuelle Umgebung aktiviert. Über die CLI führen Sie sie mit aussource
source $env_name/bin/activate
Dabei ist $ env_name offensichtlich der Name des Verzeichnisses, in dem die virtuelle Umgebung installiert ist.
In meinem Skript speichere ich nach dem Erstellen der virtuellen Umgebung den Pfad zum Aktivierungsskript wie folgt:
activate="`pwd`/$ENV_NAME/bin/activate"
Aber wenn ich anrufe source "$activate"
, bekomme ich folgendes:
/home/clawlor/bin/scripts/djangoenv: 20: source: not found
Ich weiß, dass dies $activate
den richtigen Pfad zum Aktivierungsskript enthält. Tatsächlich teste ich sogar, dass eine Datei vorhanden ist, bevor ich aufrufe source
. Aber source
selbst scheint es nicht zu finden. Ich habe auch versucht, alle Schritte manuell in der CLI auszuführen, wo alles gut funktioniert.
Bei meinen Recherchen habe ich dieses Skript gefunden , das dem ähnelt, was ich möchte, aber auch viele andere Dinge tut, die ich nicht benötige, wie das Speichern aller virtuellen Umgebungen in einem ~ / .virtualenv-Verzeichnis (oder was auch immer sich darin befindet) $ WORKON_HOME). Aber es scheint mir, dass er den Weg dorthin schafft activate
und source "$activate"
im Grunde genauso anruft, wie ich es 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 Script-Fu ist ziemlich schwach. Ich fühle mich in der CLI ziemlich wohl, aber es kann durchaus einen extrem dummen Grund geben, warum dies nicht funktioniert.
quelle
In dem POSIX-Standard, der
/bin/sh
respektieren soll, ist der Befehl.
(ein einzelner Punkt) nichtsource
. Dersource
Befehl ist eincsh
-ismus, in den hineingezogen wurdebash
.Versuchen
Oder wenn Sie Nicht-POSIX-
bash
Organismen in Ihrem Code haben müssen, verwenden Sie#!/bin/bash
.quelle
source
ist das Handbuch ein Synonym für.
./bin/sh -c '/path/to/script.sh'
. Obwohl mein Skript ein Bash-Skript war, konnte die Quelle die Exporte nicht beschaffen. Aber "." hat funktioniert!Wenn Sie in Ubuntu das Skript mit ausführen
sh scriptname.sh
, tritt dieses Problem auf.Versuchen Sie
./scriptname.sh
stattdessen , das Skript mit auszuführen .quelle
chmod +x filename.sh