ปัญหา
คำตอบที่ยอมรับกันโดยทั่วไปจะใช้ได้เฉพาะในเงื่อนไขที่สำคัญเท่านั้น ให้ ...
/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 โหลดเนื้อหาของไฟล์ที่ระบุลงในเชลล์ปัจจุบัน