Estoy tratando de escribir (lo que pensé que sería) un sencillo script en bash que:

  1. ejecutar virtualenv para crear un nuevo ambiente en $1
  2. activar el entorno virtual
  3. hacer algunas cosas más (instalar django, agregar django-admin.py para el virtualenv la ruta de acceso, etc).

Paso 1 funciona bastante bien, pero me parece que no puede activar el virtualenv. Para aquellos no familiarizados con virtualenv, crea una activate archivo que activa el entorno virtual. Desde la CLI, que se ejecuta mediante source

source $env_name/bin/activate

Donde $env_name, obviamente, es el nombre de la dir que el virtual env está instalado.

En mi script, después de crear el entorno virtual, en que se guarda la ruta de acceso al activar el script como este:

activate="`pwd`/$ENV_NAME/bin/activate"

Pero cuando me llaman source "$activate", me sale esto:

/home/clawlor/bin/scripts/djangoenv: 20: source: not found

Sé que $activate contiene la ruta de acceso correcta al activar la secuencia de comandos, de hecho, yo incluso la prueba de que un archivo está ahí antes de que yo llame source. Pero source sí parece que no puede encontrar. También he tratado de ejecutar todos los pasos de forma manual en la CLI, donde todo funciona bien.

En mi investigación, he encontrado esta secuencia de comandos, que es similar a lo que yo quiero sino que también está haciendo un montón de otras cosas que no necesito, como el almacenamiento de todos los ambientes virtuales en ~/.virtualenv directorio (o lo que sea es de $WORKON_HOME). Pero a mí me parece que él es la creación de la ruta de acceso a activate, y llamando source "$activate" básicamente de la misma manera que yo soy.

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

DESCARGO de responsabilidad: Mi bash script-fu es muy débil. Me siento bastante cómodo en la CLI, pero no pueden ser algunos muy estúpida razón de que esto no está funcionando.

InformationsquelleAutor Chris Lawlor | 2009-03-21

3 Comentarios

  1. 220

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

    #!/bin/bash

    /bin/sh no está garantizada para ser bash. Esto causó una tonelada de fracturas de secuencias de comandos en Ubuntu hace algunos años (CREO).

    La fuente builtin funciona bien en bash; pero usted podría utilizar como punto de Norman sugerido.

    • Esta solución fue originalmente un comentario en Norman Ramsey respuesta. Ya que esto es lo que realmente se ha solucionado el problema, he cambiado esto a ser el ‘aceptado la respuesta»
  2. 171

    En el estándar POSIX, que /bin/sh se supone que es el respeto, el comando es . (un solo punto), no source. El source comando es una csh-ismo que ha sido retirado bash.

    Intentar

    . $env_name/bin/activate

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

    • Que lo arregla. (cambio de /bin/sh a /bin/bash). Por alguna razón, el medio ambiente no está activado en el CLI, cuando finalice la secuencia de comandos, pero eso es un problema menor.
    • De acuerdo a la manual de Bash source es un sinónimo de ..
    • Me encontré con este cuando se utiliza una ventana acoplable recipiente con el punto de entrada como esta, /bin/sh -c '/path/to/script.sh'. A pesar de que mi escritura era un script de bash, fuente de error a la fuente de las exportaciones. Pero «.» funcionó!
  3. 27

    En Ubuntu si se ejecuta el script con sh scriptname.sh usted recibe este problema.

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

    • tengo un fallo de segmentación al hacer esto.
    • El archivo debe ser ejecutable: chmod +x filename.sh

Dejar respuesta

Please enter your comment!
Please enter your name here