152 votes

Faire une " source: pas trouvé d'erreur lors de l'utilisation de la source dans un script bash

Je suis en train d'écrire (ce que je pensais serait) un simple script bash:

  1. exécuter virtualenv pour créer un nouvel environnement à $1
  2. activer l'environnement virtuel
  3. faire plus de choses (installer django, ajouter django-admin.py pour le virtualenv du chemin d'accès, etc.)

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

source $env_name/bin/activate

Où $env_name, évidemment, est le nom de la dir que le virtuel env est installé.

Dans mon script, après la création de l'environnement virtuel, je stocke le chemin d'accès pour activer le script comme ceci:

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

Mais quand je l'appelle source "$activate", j'obtiens ceci:

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

Je sais qu' $activate contient le chemin d'accès correct pour activer le script, en fait j'ai même vérifier qu'un fichier est là avant que j'appelle source. Mais source lui-même n'arrive pas à trouver. J'ai aussi essayé de l'exécution de toutes les étapes manuellement dans l'interface CLI, où tout fonctionne très bien.

Dans mes recherches j'ai trouvé ce script, qui est similaire à ce que je veux, mais c'est faire beaucoup d'autres choses que je n'ai pas besoin, comme le stockage de tous les environnements virtuels dans un ~/.virtualenv répertoire (ou tout ce qui est dans $WORKON_HOME). Mais il me semble qu'il est de créer le chemin de activate, et en appelant source "$activate" en gros 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

AVERTISSEMENT: Mon script bash-fu est assez faible. Je suis assez à l'aise à la CLI, mais il pourrait bien y avoir quelques très stupide raison, ce n'est pas de travail.

221voto

guns Points 3881

Si vous écrivez un script bash, de l'appeler par son nom:

#!/bin/bash

/bin/sh n'est pas garanti à bash. Cela a provoqué une tonne de cassé scripts dans Ubuntu il y a quelques années (IIRC).

La source builtin fonctionne très bien en bash; mais vous pourriez tout aussi bien utiliser dot comme Norman suggéré.

175voto

Norman Ramsey Points 115730

En bash, la commande est . (un seul point), pas source. L' source de commande est un csh-ism.

Essayez

. $env_name/bin/activate

27voto

Madhu Points 41

Dans ubuntu, si vous êtes de l'exécution du script sh scriptname.sh ensuite, vous recevrez ce problème. Essayez d'exécuter le script comme ./scriptname.sh. Votre problème sera résolu.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X