ได้รับข้อผิดพลาด 'แหล่งที่มา: ไม่พบ' เมื่อใช้แหล่งข้อมูลในสคริปต์ทุบตี


159

ฉันพยายามเขียน (สิ่งที่ฉันคิดว่าเป็น) สคริปต์ทุบตีง่ายๆที่จะ:

  1. ใช้ virtualenv เพื่อสร้างสภาพแวดล้อมใหม่ที่ $ 1
  2. เปิดใช้งานสภาพแวดล้อมเสมือนจริง
  3. ทำบางสิ่งเพิ่มเติม (ติดตั้ง django เพิ่ม django-admin.py ไปยังเส้นทางของ virtualenv ฯลฯ )

ขั้นตอนที่ 1 ทำงานได้ค่อนข้างดี แต่ฉันไม่สามารถเปิดใช้งาน virtualenv ได้ สำหรับผู้ที่ไม่คุ้นเคยกับ virtualenv มันจะสร้างactivateไฟล์ที่เปิดใช้งานสภาพแวดล้อมเสมือน จาก CLI คุณเรียกใช้โดยใช้source

source $env_name/bin/activate

โดยที่ $ env_name เห็นได้ชัดว่าเป็นชื่อของ dir ที่ติดตั้ง env เสมือน

ในสคริปต์ของฉันหลังจากสร้างสภาพแวดล้อมเสมือนฉันเก็บเส้นทางไปยังสคริปต์เปิดใช้งานเช่นนี้:

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

แต่เมื่อฉันโทรsource "$activate"ฉันจะได้รับสิ่งนี้:

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

ฉันรู้ว่ามีเส้นทางที่ถูกต้องไปยังสคริปต์เปิดใช้งานในความเป็นจริงผมยังทดสอบที่ไฟล์จะมีก่อนที่ผมจะโทร$activate sourceแต่sourceตัวมันเองก็หาไม่เจอ ฉันได้ลองทำทุกขั้นตอนด้วยตนเองใน CLI ซึ่งทุกอย่างทำงานได้ดี

ในการวิจัยของฉันฉันพบสคริปต์นี้ซึ่งคล้ายกับสิ่งที่ฉันต้องการ แต่ยังทำสิ่งอื่น ๆ อีกมากมายที่ฉันไม่ต้องการเช่นการจัดเก็บสภาพแวดล้อมเสมือนทั้งหมดในไดเรกทอรี ~ / .virtualenv (หรืออะไรก็ตามที่อยู่ใน $ WORKON_HOME) แต่สำหรับฉันแล้วดูเหมือนว่าเขากำลังสร้างเส้นทางไปactivateและเรียกsource "$activate"โดยทั่วไปว่าเป็นฉัน

นี่คือสคริปต์ที่ครบถ้วน

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

การปฏิเสธความรับผิด: สคริปต์ทุบตีของฉันค่อนข้างอ่อนแอ ฉันค่อนข้างสบายใจที่ CLI แต่อาจมีเหตุผลบางอย่างที่โง่มากที่นี่ไม่ทำงาน

คำตอบ:


230

หากคุณกำลังเขียนสคริปต์ทุบตีเรียกมันตามชื่อ:

#!/bin/bash

/ bin / sh ไม่รับประกันว่าจะถูกทุบตี สิ่งนี้ทำให้สคริปต์ที่ใช้งานไม่ได้ใน Ubuntu เมื่อหลายปีก่อน (IIRC)

builtin แหล่งทำงานได้ดีในทุบตี; แต่คุณก็อาจใช้จุดตามที่นอร์แมนแนะนำ


การแก้ปัญหานี้เป็นความเห็นเดิมในคำตอบของ Norman Ramsey ตั้งแต่นี้เป็นสิ่งที่จริงการแก้ไขปัญหาให้ฉันได้เปลี่ยนนี้จะเป็น 'คำตอบที่ได้รับการยอมรับ'
คริส Lawlor

185

ในมาตรฐาน POSIX ซึ่ง/bin/shควรจะเคารพคำสั่ง.(จุดเดียว) sourceไม่ได้ sourceคำสั่งเป็นcsh-ism bashที่ได้รับการดึงเข้าไป

ลอง

. $env_name/bin/activate

หรือถ้าคุณต้องมีไม่ใช่ POSIX bash-isms #!/bin/bashในรหัสของคุณใช้


1
ที่แก้ไขมัน (เปลี่ยน / bin / sh เป็น / bin / bash) ด้วยเหตุผลบางอย่างสภาพแวดล้อมไม่ได้เปิดใช้งานใน CLI เมื่อสคริปต์เสร็จสิ้น แต่นั่นเป็นปัญหาเล็กน้อย
395 Chris Lawlor

8
ตามที่คู่มือการทุบตี เป็นคำพ้องสำหรับsource .
Richard Hansen

1
ฉันเจอสิ่งนี้เมื่อใช้ container docker กับ entrypoint แบบนี้, /bin/sh -c '/path/to/script.sh'. แม้ว่าสคริปต์ของฉันเป็นสคริปต์ทุบตี แต่แหล่งที่มาไม่สามารถส่งออกได้ แต่ "." ทำงาน!
Nikhil Owalekar

31

ใน Ubuntu ถ้าคุณรันสคริปต์พร้อมกับsh scriptname.shคุณได้รับปัญหานี้

ลองเรียกใช้งานสคริปต์ด้วย./scriptname.shแทน


ฉันได้รับการแบ่งส่วนเมื่อทำเช่นนี้
สูงสุด

1
ไฟล์จะต้องสามารถใช้งานได้:chmod +x filename.sh
แรนดี้

2
ความคิดใดว่าทำไมนี่คือ?
Yuval Adam

สิ่งเดียวที่ใช้ได้กับ Ubuntu 20.04 ของฉัน
Kirill_Zaitsev
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.