2009-03-21 7 views
102

Je suis en train d'écrire (ce que je pensais être) un simple script bash qui:Obtenir une 'source: not found' erreur lors de l'utilisation source dans un script bash

  1. run virtualenv pour créer un nouvel environnement à 1
  2. $ activer l'environnement virtuel
  3. faire un peu plus de choses (installer django, ajouter django-admin.py au chemin du virtualenv, etc.)

Étape 1 fonctionne très bien, mais je ne peut pas sembler activer le virtualenv. Pour ceux qui ne connaissent pas virtualenv, il crée un fichier activate qui active l'environnement virtuel. A partir de la CLI, vous exécutez à l'aide source

source $env_name/bin/activate 

Où env_name de $, de toute évidence, est le nom du répertoire que le env virtuel est installé.

Dans mon script, après avoir créé l'environnement virtuel, Je stocke le chemin du script activate comme ceci:

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

Mais quand je l'appelle source "$activate", je reçois ceci:

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

Je sais que $activate contient le bon chemin vers le script d'activation, en fait je vérifie même qu'un fichier est là avant que j'appelle source. Mais source lui-même ne peut pas sembler le trouver. J'ai également essayé d'exécuter toutes les étapes manuellement dans la CLI, où tout fonctionne bien.

Dans ma recherche, j'ai trouvé this script, ce qui est similaire à ce que je veux mais fait aussi beaucoup d'autres choses dont je n'ai pas besoin, comme le stockage de 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 vers activate, et appelle source "$activate" de la même manière que je suis.

Voici le script dans son intégralité:

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

DISCLAIMER: Mon script-fu de bash est assez faible. Je suis assez à l'aise à la CLI, mais il peut y avoir une raison extrêmement stupide que cela ne fonctionne pas.

Répondre

168

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

#!/bin/bash 

/bin/sh n'est pas garanti 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 Norman suggéré.

+0

Cette solution était à l'origine un commentaire dans la réponse de Norman Ramsey. Puisque c'est ce qui a réellement réglé le problème, j'ai changé cela pour être la 'réponse acceptée' –

+0

La bonne réponse est Ramsey n'est pas des canons. – Enzo

128

Dans la norme POSIX, que /bin/sh est censée respecter, la commande est . (un seul point), et non source. La commande source est un csh -ism qui a été tiré dans bash.

Essayez

. $env_name/bin/activate 

Ou si vous devez avoir non POSIX bash ismes dans votre code, utilisez #!/bin/bash.

+1

Cela le corrige. (changer/bin/sh pour/bin/bash). Pour une raison quelconque, l'environnement n'est pas activé dans la CLI lorsque le script se termine, mais c'est un problème mineur. –

+3

Selon le [Bash manual] (https://www.gnu.org/software/bash/manual/html_node/Bash-Builtins.html#index-source) 'source' est un synonyme de' .'. –

+0

Merci pour votre aide –

19

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

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

+0

J'ai eu une erreur de segmentation en faisant cela. –

+2

Merci beaucoup, cela a résolu le problème pour moi. –

+0

Le fichier doit être exécutable: 'chmod + x filename.sh' – Randy

Questions connexes