Obtenir une « source: not found » erreur lors de l'utilisation source dans un script bash
-
21-08-2019 - |
Question
Je suis en train d'écrire (ce que je pensais être) un simple script bash qui:
- run virtualenv pour créer un nouvel environnement à 1 $
- activer l'environnement virtuel
- faire un peu plus de choses (installer django, ajouter django-admin.py au chemin du virtualenv, etc.)
Étape 1 fonctionne semblent très bien, mais je ne peux pas activer le virtualenv. Pour ceux qui ne connaissent virtualenv, il crée un fichier qui active l'activate
environnement virtuel. A partir de la CLI, vous exécutez à l'aide de 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 contient le chemin $activate
correct au script activate, je teste en fait même qu'un fichier est là avant que j'appelle <=>. Mais elle-même ne peut pas <=> semblent trouver. J'ai aussi essayé de courir toutes les étapes manuellement dans le CLI, où tout fonctionne très bien.
Dans mes recherches, je trouve ce script , qui est similaire à ce que je veux, mais fait aussi beaucoup d'autres choses que je ne ai pas besoin, comme le stockage de toutes les environnements virtuels dans un répertoire ~ / .virtualenv (ou tout ce qui est en WORKON_HOME $). Mais il me semble qu'il crée le chemin vers <=> et appelant fondamentalement de la <=> même façon que je suis.
est le script ici 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 pourrait bien y avoir une raison extrêmement stupide cela ne fonctionne pas.
La solution
Si vous écrivez un script bash, appelez-le par son nom:
#!/bin/bash
/ bin / sh n'est pas garanti bash. Cela a provoqué une tonne de scripts cassés il y a dans Ubuntu quelques années (IIRC).
La source des œuvres builtin très bien dans bash; mais vous pourriez tout aussi bien utiliser comme point Norman a suggéré.
Autres conseils
Dans le standard, qui /bin/sh
est censé respecter, la commande est .
(un seul point), non source
. La commande est un csh
bash
- isme qui a été tiré dans #!/bin/bash
Essayez
. $env_name/bin/activate
Ou si vous devez avoir non POSIX <=> -. Ismes dans votre code, utilisez <=>
Dans Ubuntu si vous exécutez le script avec vous obtenez ce sh scriptname.sh
problème.
Essayez d'exécuter le script avec la place ./scriptname.sh
.