2009-03-21 36 views
102

Tôi đang cố gắng để viết (những gì tôi nghĩ rằng sẽ là) một kịch bản bash đơn giản mà sẽ:Bắt một 'nguồn: không tìm thấy' lỗi khi sử dụng nguồn trong một kịch bản bash

  1. chạy virtualenv để tạo ra một môi trường mới tại $ 1
  2. kích hoạt môi trường ảo
  3. làm một số công cụ hơn (cài đặt django, thêm django-admin.py đến con đường của virtualenv vv)

Bước 1 hoạt động khá tốt, nhưng tôi dường như không thể kích hoạt virtualenv. Đối với những người không quen thuộc với virtualenv, nó tạo ra một tệp activate kích hoạt môi trường ảo. Từ CLI, bạn chạy nó bằng cách sử source

source $env_name/bin/activate 

đâu $ env_name, rõ ràng, là tên của thư mục mà env ảo được cài đặt trong.

Trong kịch bản của tôi, sau khi tạo môi trường ảo, tôi lưu trữ đường dẫn đến kịch bản kích hoạt như thế này:

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

Nhưng khi tôi gọi source "$activate", tôi có được điều này:

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

Tôi biết rằng $activate chứa đường dẫn chính xác đến tập lệnh kích hoạt, trên thực tế tôi thậm chí còn kiểm tra xem tệp có ở đó trước khi tôi gọi source hay không. Nhưng source chính nó dường như không thể tìm thấy nó. Tôi cũng đã thử chạy tất cả các bước thủ công trong CLI, nơi mọi thứ hoạt động tốt.

Trong nghiên cứu của mình, tôi tìm thấy this script, tương tự như những gì tôi muốn nhưng cũng đang thực hiện rất nhiều thứ khác mà tôi không cần, như lưu trữ tất cả các môi trường ảo trong thư mục ~/.virtualenv (hoặc bất cứ thứ gì trong $ WORKON_HOME). Nhưng có vẻ như với tôi rằng anh ấy đang tạo đường dẫn đến activate và gọi số source "$activate" về cơ bản giống như tôi.

Đây là kịch bản trong toàn bộ của nó:

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

SỰ TỪ BỎ: bash My script-fu là khá yếu. Tôi khá thoải mái ở CLI, nhưng cũng có thể có một số lý do cực kỳ ngu ngốc mà nó không hoạt động.

Trả lời

168

Nếu bạn đang viết một kịch bản bash, gọi nó theo tên:

#!/bin/bash 

/bin/sh là không đảm bảo được bash. Điều này gây ra một tấn kịch bản bị hỏng trong Ubuntu một vài năm trước đây (IIRC).

Công cụ dựng sẵn nguồn hoạt động tốt trong bash; nhưng bạn cũng có thể sử dụng dấu chấm như Norman gợi ý.

+0

Giải pháp này ban đầu là một bình luận trong câu trả lời của Norman Ramsey. Vì đây là những gì thực sự cố định vấn đề, tôi đã thay đổi điều này thành 'câu trả lời được chấp nhận' –

+0

Câu trả lời đúng là súng không phải của Ramsey '. – Enzo

128

Trong tiêu chuẩn POSIX, trong đó /bin/sh được coi là tôn trọng, lệnh là . (một dấu chấm), không phải source. Lệnh sourcecsh -ism đã được kéo vào bash.

Hãy thử

. $env_name/bin/activate 

Hoặc nếu bạn phải có phi POSIX bash -isms trong mã của bạn, sử dụng #!/bin/bash.

+1

Sửa lỗi đó. (thay đổi/bin/sh thành/bin/bash). Đối với một số lý do môi trường không được kích hoạt trong CLI khi kịch bản kết thúc, nhưng đó là một vấn đề nhỏ. –

+3

Theo [hướng dẫn sử dụng Bash] (https://www.gnu.org/software/bash/manual/html_node/Bash-Builtins.html#index-source) 'nguồn' là một từ đồng nghĩa với' .'. –

+0

Cảm ơn sự giúp đỡ của bạn –

19

Trong Ubuntu nếu bạn thực thi tập lệnh với sh scriptname.sh bạn gặp sự cố này.

Thay vào đó hãy thử thực thi tập lệnh với ./scriptname.sh.

+0

tôi bị lỗi phân đoạn khi thực hiện việc này. –

+2

Cảm ơn rất nhiều, điều này giải quyết được vấn đề cho tôi. –

+0

Tệp phải được thực thi: 'chmod + x filename.sh' – Randy

Các vấn đề liên quan