Obtenir une erreur ‘source: not found’ lors de l’utilisation de la source dans un script bash

J’essaie d’écrire (ce que je pensais être) un simple script bash qui:

  1. lancez virtualenv pour créer un nouvel environnement à 1 $
  2. activer l’environnement virtuel
  3. faites d’autres choses (installez django, ajoutez django-admin.py au chemin de virtualenv, etc.)

L’étape 1 fonctionne assez bien, mais je n’arrive pas à activer virtualenv. Pour ceux qui ne sont pas familiarisés avec virtualenv, il crée un fichier d’activation qui active l’environnement virtuel. A partir de l’interface de ligne de commande, vous l’exécutez à l’aide de la source

 source $env_name/bin/activate 

Où $ env_name, évidemment, est le nom du répertoire dans lequel env virtuel est installé.

Dans mon script, après avoir créé l’environnement virtuel, je stocke le chemin d’access au script d’activation comme suit:

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

Mais quand j’appelle source "$activate" , j’obtiens ceci:

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

Je sais que $activate contient le chemin correct vers le script d’activation, en fait je teste même qu’il ya un fichier avant d’appeler source . Mais la source elle-même ne semble pas pouvoir le trouver. J’ai également essayé de lancer toutes les étapes manuellement dans la CLI, où tout fonctionne correctement.

Dans mes recherches, j’ai trouvé ce script , qui est similaire à ce que je veux, mais fait aussi beaucoup d’autres choses dont je n’ai pas besoin, comme stocker tous les environnements virtuels dans un répertoire ~ / .virtualenv (ou tout ce qui est dans $ WORKON_HOME). Mais il me semble qu’il crée le chemin à activate et que l’appel à la source "$activate" fondamentalement le même que moi.

Voici le script en entier:

 #!/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 

AVERTISSEMENT: Mon script bas-fu est assez faible. Je suis assez à l’aise à la CLI, mais il y a peut-être une raison extrêmement stupide que cela ne fonctionne pas.

Si vous écrivez un script bash, appelez-le par son nom:

 #!/bin/bash 

/ bin / sh n’est pas garanti pour être bash. Cela a causé une tonne de scripts cassés dans Ubuntu il y a quelques années (IIRC).

La source intégrée fonctionne très bien dans bash; mais vous pourriez aussi bien utiliser un point comme suggéré par Norman.

Dans le standard POSIX, que /bin/sh est censé respecter, la commande est . (un seul point), pas de source . La commande source est un csh -ism qui a été extrait dans bash .

Essayer

 . $env_name/bin/activate 

Ou, si vous avez des non -ismes non-POSIX dans votre code, utilisez #!/bin/bash .

Dans Ubuntu, si vous exécutez le script avec sh scriptname.sh vous rencontrez ce problème.

Essayez plutôt d’exécuter le script avec ./scriptname.sh