ปัญหา
คำตอบที่ยอมรับกันโดยทั่วไปจะใช้ได้เฉพาะในเงื่อนไขที่สำคัญเท่านั้น ให้ ...
/foo/bar/first.sh
:
function func1 {
echo "Hello $1"
}
และ
/foo/bar/second.sh
:
#!/bin/bash
source ./first.sh
func1 World
จะใช้งานได้ก็ต่อเมื่อfirst.sh
มีการเรียกใช้งานจากภายในไดเร็กทอรีเดียวกันกับที่first.sh
ตั้งอยู่ ได้แก่ . หากเส้นทางการทำงานปัจจุบันของเชลล์คือ/foo
ความพยายามที่จะรันคำสั่ง
cd /foo
./bar/second.sh
พิมพ์ข้อผิดพลาด:
/foo/bar/second.sh: line 4: func1: command not found
นั่นเป็นเพราะsource ./first.sh
มันสัมพันธ์กับเส้นทางการทำงานปัจจุบันไม่ใช่เส้นทางของสคริปต์ ดังนั้นวิธีแก้ปัญหาหนึ่งคือการใช้ subshell และเรียกใช้
(cd /foo/bar; ./second.sh)
โซลูชันทั่วไปเพิ่มเติม
ให้ ...
/foo/bar/first.sh
:
function func1 {
echo "Hello $1"
}
และ
/foo/bar/second.sh
:
#!/bin/bash
source $(dirname "$0")/first.sh
func1 World
แล้ว
cd /foo
./bar/second.sh
พิมพ์
Hello World
มันทำงานอย่างไร
$0
ส่งคืนพา ธ สัมพัทธ์หรือสัมบูรณ์ไปยังสคริปต์ที่เรียกใช้งาน
dirname
ส่งคืนพา ธ สัมพัทธ์ไปยังไดเร็กทอรีซึ่งมีสคริปต์ $ 0 อยู่
$( dirname "$0" )
dirname "$0"
คำสั่งส่งคืนทางญาติยังไดเรกทอรีของสคริปต์ดำเนินการซึ่งจะใช้แล้วเป็นอาร์กิวเมนต์สำหรับsource
คำสั่ง
- ใน "second.sh"
/first.sh
เพียงต่อท้ายชื่อของเชลล์สคริปต์ที่นำเข้า
source
โหลดเนื้อหาของไฟล์ที่ระบุลงในเชลล์ปัจจุบัน