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 activate
archivo 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 $activate
contiene la ruta correcta al script de activación, de hecho, incluso pruebo que hay un archivo antes de llamar source
. Pero source
parece 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 activate
y 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/sh
se supone debe respetar, el comando es.
(un solo punto), nosource
. Elsource
comando es uncsh
-ismo en el que se ha introducidobash
.Tratar
O bien, si debe tener organismos que no sean POSIX
bash
en su código, use#!/bin/bash
.fuente
source
es 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.sh
lugar.fuente
chmod +x filename.sh