J'essaie d'écrire (ce que je pensais être) un script bash simple qui va:
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.
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.
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
.
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.