Ich versuche zu schreiben (was ich dachte), ein einfaches Bash-Skript, das:
- Führen Sie virtualenv aus, um eine neue Umgebung mit $ 1 zu erstellen
- Aktivieren Sie die virtuelle Umgebung
- 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 activate
und 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 № 1Wenn 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.