sirve script que programas pasar parametros para operaciones manejo espaƱol ejemplos comandos comando cadenas aritmeticas bash virtualenv

que - Obteniendo un error de ''fuente: no encontrado'' cuando se usa source en un script bash



pasar parametros shell script (3)

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

Intente ejecutar el script con ./scriptname.sh lugar.

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

  1. ejecuta virtualenv para crear un nuevo entorno a $ 1
  2. activar el entorno virtual
  3. haga algunas cosas más (instale django, agregue django-admin.py a la ruta de Virtualenv, etc.)

El paso 1 funciona bastante bien, pero parece que no puedo activar el virtualenv. Para aquellos que no estén familiarizados con virtualenv, crea un archivo de activación que activa el entorno virtual. Desde la CLI, la ejecuta usando la source

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 a la source "$activate" , obtengo 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 un archivo está allí antes de llamar a la source . Pero la source misma parece no poder encontrarlo. También intenté ejecutar todos los pasos manualmente en la CLI, donde todo funciona bien.

En mi investigación encontré esta secuencia de comandos , 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é $ WORKON_HOME). Pero me parece que está creando el camino para activate y llamando a la 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: My bash 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.


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

Tratar

. $env_name/bin/activate

O si debe tener bash -isis no POSIX en su código, use #!/bin/bash .


Si estás escribiendo un script bash, llámalo por nombre:

#!/bin/bash

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

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