web-dev-qa-db-fra.com

Obtention d'une erreur 'source: not found' lors de l'utilisation de source dans un script bash

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

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

L'étape 1 fonctionne assez bien, mais je n'arrive pas à activer le virtualenv. Pour ceux qui ne sont pas familiers avec virtualenv, il crée un fichier activate qui active l’environnement virtuel. A partir de la CLI, vous l’exécutez avec 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'accès au script d'activation de la manière suivante:

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

Mais quand j'appelle source "$activate", J'ai compris:

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

Je le sais $activate contient le chemin correct du script d’activation. En fait, j’ai même vérifié qu’un fichier existait avant d’appeler source. Mais source lui-même ne semble pas pouvoir le trouver. J'ai également essayé d'exécuter toutes les étapes manuellement dans la CLI, où tout fonctionne bien.

Dans mes recherches, j'ai trouvé ce script , ce 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 se trouve dans $ WORKON_HOME). Mais il me semble qu’il crée le chemin vers activate et appelle source "$activate" dans les mêmes termes que moi.

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

AVERTISSEMENT: Mon script bash-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.

145
Chris Lawlor

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

#!/bin/bash

Il n'est pas garanti que/bin/sh soit 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 pouvez aussi bien utiliser le point tel que suggéré par Norman.

218
guns

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

Essayer

. $env_name/bin/activate

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

169
Norman Ramsey

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

Essayez d’exécuter le script avec ./scriptname.sh au lieu.

26
Madhu