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 activate
file 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 $activate
contiene il percorso corretto per attivare lo script, infatti provo persino che un file è lì prima di chiamare source
. Ma di per source
sé 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 activate
e 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.