Sto cercando di scrivere (quello che pensavo sarebbe stato) un semplice script bash che:
- esegui virtualenv per creare un nuovo ambiente a $ 1
- attivare l'ambiente virtuale
- fare altro (installare django, aggiungere django-admin.py al percorso di virtualenv, ecc.)
Il passaggio 1 funziona abbastanza bene, ma non riesco ad attivare virtualenv. Per coloro che non hanno familiarità con virtualenv, crea un activatefile che attiva l'ambiente virtuale. Dalla CLI, la esegui usandosource
source $env_name/bin/activate
Dove $ env_name, ovviamente, è il nome della directory in cui è installato l'env virtuale.
Nel mio script, dopo aver creato l'ambiente virtuale, memorizzo il percorso dello script di attivazione in questo modo:
activate="`pwd`/$ENV_NAME/bin/activate"
Ma quando chiamo source "$activate", ottengo questo:
/home/clawlor/bin/scripts/djangoenv: 20: source: not found
So che $activatecontiene il percorso corretto per attivare lo script, infatti provo persino che un file è lì prima di chiamare source. Ma di per sourcesé non riesce a trovarlo. Ho anche provato a eseguire tutti i passaggi manualmente nella CLI, dove tutto funziona bene.
Nella mia ricerca ho trovato questo script , che è simile a quello che voglio ma sta facendo anche molte altre cose di cui non ho bisogno, come archiviare tutti gli ambienti virtuali in una directory ~ / .virtualenv (o qualunque cosa sia $ WORKON_HOME). Ma mi sembra che stia creando il percorso activatee che stia chiamando source "$activate"sostanzialmente nello stesso modo in cui sono io.
Ecco lo script nella sua interezza:
#!/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
DISCLAIMER: Il mio script-fu bash è piuttosto debole. Sono abbastanza a mio agio con la CLI, ma potrebbe esserci qualche ragione estremamente stupida per cui questo non funziona.