Bir bash betiğinde kaynak kullanılırken 'kaynak: bulunamadı' hatası alma


159

(Ne olacağını düşündüm) olacak basit bir bash komut dosyası yazmaya çalışıyorum:

  1. $ 1 yeni bir ortam oluşturmak için virtualenv çalıştırın
  2. sanal ortamı etkinleştir
  3. daha fazla şey yapın (django'yu yükleyin, sanalenv yoluna django-admin.py ekleyin, vb.)

Adım 1 oldukça iyi çalışıyor, ancak virtualenv'i etkinleştiremiyorum. Virtualenv'e aşina olmayanlar için activate, sanal ortamı aktive eden bir dosya oluşturur . CLI'den şunu kullanarak çalıştırırsınız:source

source $env_name/bin/activate

Burada $ env_name, sanal env'nin kurulu olduğu dir adıdır.

Komut dosyamda, sanal ortamı oluşturduktan sonra, etkinleştirme komut dosyasının yolunu şu şekilde saklıyorum:

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

Ama aradığımda şunu source "$activate"alıyorum:

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

Ben $activateetkinleştirmek komut dosyası için doğru yolu içerir biliyorum, aslında ben bile aramadan önce bir dosya olduğunu test source. Ama sourcekendisi bulamıyor gibi görünüyor. Ayrıca, her şeyin düzgün çalıştığı tüm adımları CLI'de manuel olarak çalıştırmayı denedim.

Benim araştırmada Ben buldum bu senaryoyu ne istiyorum benzer değil, aynı zamanda ~ / .virtualenv dizinde sanal ortamlarda saklandığı gibi, ben gerekmez diğer bir çok şey yapıyor (ya da her neyse edilir $ WORKON_HOME). Ama bana öyle geliyor ki, onun yolunu yaratıyor ve benimle aynı şekilde activateçağırıyor source "$activate".

İşte betiğin tamamı:

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

YASAL UYARI: Benim bash script-fu oldukça zayıf. CLI'da oldukça rahatım, ancak bunun işe yaramamasının son derece aptalca bir nedeni olabilir.

Yanıtlar:


230

Bir bash betiği yazıyorsanız, ada göre arayın:

#!/bin/bash

/ bin / sh tuşunun bash olduğu garanti edilmez. Bu, birkaç yıl önce Ubuntu'da bir ton bozuk komut dosyasına neden oldu (IIRC).

Kaynak yerleşik bash iyi çalışır; ama Norman'ın önerdiği gibi nokta da kullanabilirsiniz.


Bu çözüm aslında Norman Ramsey'in cevabına bir yorumdu. Sorunu gerçekten düzelten şey bu olduğundan, bunu 'kabul edilen cevap' olarak değiştirdim
Chris Lawlor

185

/bin/shSaygı duyulması gereken POSIX standardında, komut .(tek bir nokta), değil source. sourceKomutu a cshçekilmiş durumdaysa -ism bash.

Deneyin

. $env_name/bin/activate

Veya bashkodunuzda POSIX olmayan öğeler varsa , kullanın #!/bin/bash.


1
Bu onu düzeltir. (/ bin / sh / / bin / bash olarak değiştirilir). Herhangi bir nedenle, komut dosyası bittiğinde ortam CLI'de etkinleştirilmez, ancak bu küçük bir sorundur.
Chris Lawlor

8
Bash kılavuzuna göre sourceeşanlamlıdır ..
Richard Hansen

1
Bunun gibi giriş noktası olan bir docker kapsayıcısı kullanırken buna rastladım /bin/sh -c '/path/to/script.sh'. Benim betiğim bir bash betiği olmasına rağmen, kaynak dışa aktarma işlemlerini gerçekleştiremedi. Fakat "." çalıştı!
Nikhil Owalekar

31

Senaryoyu çalıştırırsanız Ubuntu'da sh scriptname.shbu sorunu yaşarsınız.

./scriptname.shBunun yerine komut dosyasını çalıştırmayı deneyin .


Bunu yaparken bir segmentasyon hatası var.
max pleaner

1
Dosya yürütülebilir olmalıdır:chmod +x filename.sh
Randy

2
Neden bu olduğu hakkında bir düşünceniz var mı?
Yuval Adam

Benim Ubuntu 20.04 için çalışan tek şey
Kirill_Zaitsev
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.