Obtenir une « source: not found » erreur lors de l'utilisation source dans un script bash

StackOverflow https://stackoverflow.com/questions/670191

  •  21-08-2019
  •  | 
  •  

Question

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

  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 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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top