Estoy tratando de escribir (lo que pensé que sería) un script de bash simple que:
- ejecute virtualenv para crear un nuevo entorno a $ 1
- activar el entorno virtual
- hacer algunas cosas más (instalar django, agregar django-admin.py a la ruta del virtualenv, etc.)
El paso 1 funciona bastante bien, pero parece que no puedo activar virtualenv. Para aquellos que no están familiarizados con virtualenv, crea un activatearchivo que activa el entorno virtual. Desde la CLI, lo ejecutas usandosource
source $env_name/bin/activate
Donde $ env_name, obviamente, es el nombre del directorio en el que está instalado el env virtual.
En mi script, después de crear el entorno virtual, almaceno la ruta al script de activación de esta manera:
activate="`pwd`/$ENV_NAME/bin/activate"
Pero cuando llamo source "$activate", me sale esto:
/home/clawlor/bin/scripts/djangoenv: 20: source: not found
Sé que $activatecontiene la ruta correcta al script de activación, de hecho, incluso pruebo que hay un archivo antes de llamar source. Pero sourceparece que no puede encontrarlo. También he intentado ejecutar todos los pasos manualmente en la CLI, donde todo funciona bien.
En mi investigación encontré este script , que es similar a lo que quiero pero también está haciendo muchas otras cosas que no necesito, como almacenar todos los entornos virtuales en un directorio ~ / .virtualenv (o lo que sea que esté en $ WORKON_HOME). Pero me parece que él está creando el camino activatey llamando source "$activate"básicamente de la misma manera que yo.
Aquí está el guión en su totalidad:
#!/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
DESCARGO DE RESPONSABILIDAD: Mi bash script-fu es bastante débil. Me siento bastante cómodo en la CLI, pero puede haber alguna razón extremadamente estúpida por la que esto no funciona.
fuente

En el estándar POSIX, que
/bin/shse supone debe respetar, el comando es.(un solo punto), nosource. Elsourcecomando es uncsh-ismo en el que se ha introducidobash.Tratar
O bien, si debe tener organismos que no sean POSIX
bashen su código, use#!/bin/bash.fuente
sourcees sinónimo de../bin/sh -c '/path/to/script.sh'. Aunque mi script era un script bash, la fuente no pudo obtener las exportaciones. Pero "." ¡trabajó!En Ubuntu, si ejecutas el script
sh scriptname.sh, obtienes este problema.Intente ejecutar el script con en su
./scriptname.shlugar.fuente
chmod +x filename.sh