2009-03-21 5 views
102

Ich versuche zu schreiben (was ich dachte wäre) einen einfachen Bash-Skript, das wird mit Quelle:eine ‚Quelle: nicht gefunden‘ Erste Fehler, wenn in einem Bash-Skript

  1. Lauf virtualenv erstellen neue Umgebung bei 1 $
  2. die virtuelle Umgebung aktiviert
  3. etwas mehr Dinge tun (installieren django, fügt django-admin.py auf den Weg des virtualenv usw.)

Schritt 1 funktioniert ganz gut, aber ich kann nicht scheinen, die virtualenv zu aktivieren. Für diejenigen, die mit virtualenv nicht vertraut sind, erstellt es eine activate Datei, die die virtuelle Umgebung aktiviert. Von der CLI, führen Sie es source

source $env_name/bin/activate 

Wo $ env_name mit, natürlich, der Name des Verzeichnisses, das die virtuelle env in installiert ist.

In meinem Skript, nachdem die virtuelle Umgebung zu schaffen, ich speichere den Pfad zum activate Skript wie folgt:

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

Aber wenn ich source "$activate" nennen, bekomme ich diese:

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

Ich weiß, dass $activate den richtigen Pfad zum aktivieren Skript enthält, in der Tat ich sogar testen, dass eine Datei vorhanden ist, bevor ich source aufrufen. Aber source selbst kann nicht scheinen, es zu finden. Ich habe auch versucht, alle Schritte manuell in der CLI auszuführen, wo alles gut funktioniert.

In meiner Forschung fand ich this script, die ähnlich ist, was ich will, aber macht auch viele andere Dinge, die ich nicht brauche, wie die Speicherung aller virtuellen Umgebungen in einem ~/.virtualenv-Verzeichnis (oder was auch immer in $ WORKON_HOME ist). Aber es scheint mir, dass er den Pfad zu activate erstellt und source "$activate" auf die gleiche Weise aufruft, wie ich bin. Hier

ist das Skript in seiner Gesamtheit:

#!/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 

HAFTUNGSAUSSCHLUSS: My Bash-Skript-fu ziemlich schwach ist. Ich bin ziemlich zufrieden mit dem CLI, aber es kann durchaus ein extrem dummer Grund dafür sein, dass das nicht funktioniert.

Antwort

168

Wenn Sie ein Bash-Skript zu schreiben, rufen sie nach Name:

#!/bin/bash 

/bin/sh nicht bash sein garantiert. Das hat vor einigen Jahren in Ubuntu eine Menge defekter Skripte verursacht (IIRC).

Die eingebaute Quelle funktioniert gut in bash; aber Sie könnten auch einfach Punkt wie Norman vorgeschlagen verwenden.

+0

Diese Lösung war ursprünglich ein Kommentar in Norman Ramseys Antwort. Da dies das Problem tatsächlich behoben hat, habe ich das geändert, um die "akzeptierte Antwort" –

+0

Richtige Antwort ist Ramsey ist nicht Waffen ". – Enzo

128

Im POSIX-Standard, den /bin/sh respektieren soll, ist der Befehl . (ein einzelner Punkt), nicht source. Der source Befehl ist ein csh -ism, der in bash gezogen worden ist.

Versuchen

. $env_name/bin/activate 

Oder wenn Sie nicht-POSIX bash Ismen in Ihrem Code verwenden #!/bin/bash haben muss.

+1

Das behebt es. (Ändern/bin/sh nach/bin/bash). Aus irgendeinem Grund wird die Umgebung nach Abschluss des Skripts nicht im CLI aktiviert, aber das ist ein kleines Problem. –

+3

Laut dem [Bash Handbuch] (https://www.gnu.org/software/bash/manual/html_node/Bash-Builtins.html#index-source) ist 'source' ein Synonym für' .'. –

+0

Vielen Dank für Ihre Hilfe –

19

In Ubuntu, wenn Sie das Skript mit sh scriptname.sh10 ausführen, erhalten Sie dieses Problem.

Versuchen Sie stattdessen, das Skript mit ./scriptname.sh auszuführen.

+0

Ich habe dabei einen Segmentierungsfehler bekommen. –

+2

Vielen Dank, das hat das Problem für mich gelöst. –

+0

Die Datei muss ausführbar sein: 'chmod + x filename.sh' – Randy

Verwandte Themen