2009-03-21 22 views
102

Estoy tratando de escribir (lo que pensé que sería) un script bash simple que:Conseguir una 'fuente: no encontrado' error al utilizar la fuente en una escritura del golpe

  1. plazo para crear un virtualenv nuevo entorno en $ 1
  2. activar el entorno virtual
  3. hacer algunas cosas más (instalar Django, añadir django-admin.py a la trayectoria de la virtualenv, etc.)

Paso 1 funciona bastante bien, pero me parece que no puede activar el virtualenv. Para aquellos que no estén familiarizados con virtualenv, crea un archivo activate que activa el entorno virtual. A partir de la CLI, se ejecuta utilizando source

source $env_name/bin/activate 

Donde $ env_name, obviamente, es el nombre del directorio que el env virtual está instalado.

En mi guión, después de crear el entorno virtual, almaceno la ruta a la secuencia 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 de acceso correcta al script de activación, de hecho incluso pruebo que un archivo está allí antes de llamar al source. Pero source parece que no puede encontrarlo. También intenté ejecutar todos los pasos manualmente en la CLI, donde todo funciona bien.

En mi investigación encontré this script, que es similar a lo que quiero pero también estoy haciendo muchas otras cosas que no necesito, como almacenar todos los entornos virtuales en un directorio ~/.virtualenv (o lo que sea en $ WORKON_HOME). Pero me parece que está creando el camino hacia activate, y llamando al source "$activate" básicamente de la misma manera que yo.

Aquí está la secuencia de comandos 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 

AVISO: Mi fiesta de script-fu es bastante débil. Estoy bastante cómodo en el CLI, pero puede haber alguna razón extremadamente estúpida por la que esto no está funcionando.

Respuesta

168

Si estás escribiendo un script bash, llamarlo por su nombre:

#!/bin/bash 

/bin/sh no se garantiza que sea fiesta. Esto causó una tonelada de scripts rotos en Ubuntu hace algunos años (IIRC).

La fuente de comandos funciona bien en bash; pero también podrías usar un punto como sugirió Norman.

+0

Esta solución fue originalmente un comentario en la respuesta de Norman Ramsey. Como esto es lo que realmente solucionó el problema, he cambiado esto para que sea la 'respuesta aceptada' –

+0

La respuesta correcta es Ramsey's not guns '. – Enzo

128

En el estándar POSIX, que se supone que /bin/sh debe respetar, el comando es . (un solo punto), no source. El comando source es un csh -ism que se ha extraído en bash.

Trate

. $env_name/bin/activate 

O si debe tener no POSIX bash ismos en su código, utilice #!/bin/bash.

+1

Eso lo soluciona. (cambiando/bin/sh a/bin/bash). Por algún motivo, el entorno no se activa en la CLI cuando finaliza el guión, pero ese es un problema menor. –

+3

De acuerdo con el [Manual Bash] (https://www.gnu.org/software/bash/manual/html_node/Bash-Builtins.html#index-source) 'source' es un sinónimo de' .'. –

+0

Gracias por su ayuda –

19

En Ubuntu si ejecutas el script con sh scriptname.sh obtienes este problema.

Intente ejecutar la secuencia de comandos con ./scriptname.sh en su lugar.

+0

recibí una falla de segmentación al hacer esto. –

+2

Muchas gracias, esto me solucionó el problema. –

+0

El archivo debe ser ejecutable: 'chmod + x filename.sh' – Randy

Cuestiones relacionadas