หมายเหตุ: สำหรับโซลูชันที่สอดคล้องกับ POSIX โปรดดูคำตอบนี้
${BASH_SOURCE[0]}
(หรือเพิ่มเติมเพียง$BASH_SOURCE
[1]
) มี (อาจญาติ) เส้นทางของสคริปต์ที่มีในทุกสถานการณ์การภาวนาสะดุดตาเมื่อสคริปต์มา$0
ซึ่งไม่เป็นความจริงสำหรับ
นอกจากนี้ดังที่Charles Duffyชี้ให้เห็นว่าผู้โทร$0
สามารถตั้งค่าตามอำเภอใจได้
ในด้านพลิก$BASH_SOURCE
สามารถว่างได้หากไม่มีไฟล์ที่มีชื่อเกี่ยวข้อง เช่น:
echo 'echo "[$BASH_SOURCE]"' | bash
ตัวอย่างต่อไปนี้แสดงให้เห็นสิ่งนี้:
สคริปต์foo
:
#!/bin/bash
echo "[$0] vs. [${BASH_SOURCE[0]}]"
$ bash ./foo
[./foo] vs. [./foo]
$ ./foo
[./foo] vs. [./foo]
$ . ./foo
[bash] vs. [./foo]
$0
เป็นส่วนหนึ่งของข้อกำหนดเชลล์ POSIX ในขณะBASH_SOURCE
ที่ชื่อแนะนำเป็นเฉพาะ Bash
[1] การอ่านเพิ่มเติม: ${BASH_SOURCE[0]}
เทียบกับ$BASH_SOURCE
:
Bash ช่วยให้คุณสามารถอ้างอิงองค์ประกอบ0
ของตัวแปรอาร์เรย์โดยใช้สัญกรณ์สเกลาร์ : แทนที่จะเขียน${arr[0]}
คุณสามารถเขียน$arr
; ในคำอื่น ๆ ถ้าคุณอ้างอิงตัวแปรราวกับว่ามันเป็นสเกลา0
คุณจะได้รับองค์ประกอบที่ดัชนี
การใช้คุณสมบัตินี้บดบังความจริงที่ว่า$arr
คืออาร์เรย์ซึ่งเป็นเหตุผลว่าทำไมลินเตอร์โค้ดเชลล์ที่เป็นที่นิยมshellcheck.net จึงออกคำเตือนต่อไปนี้ (ณ การเขียนนี้):
SC2128: การขยายอาร์เรย์โดยไม่มีดัชนีจะให้องค์ประกอบแรกเท่านั้น
หมายเหตุด้านข้าง: แม้ว่าคำเตือนนี้จะมีประโยชน์ แต่ก็อาจมีความแม่นยำมากขึ้นเนื่องจากคุณไม่จำเป็นต้องได้รับองค์ประกอบแรก : โดยเฉพาะองค์ประกอบที่ดัชนี0
ที่ส่งกลับดังนั้นหากองค์ประกอบแรกมีดัชนีสูงกว่าซึ่ง เป็นไปได้ใน Bash - คุณจะได้รับสตริงว่าง ลอง'a[1]='hi'; echo "$a"'
.
(ในทางตรงกันข้ามzsh
ผู้ทรยศจะส่งกลับองค์ประกอบแรกโดยไม่คำนึงถึงดัชนีของมัน)
คุณอาจเลือกที่จะหลบหนีคุณลักษณะนี้เนื่องจากความสับสนของมัน แต่มันทำงานไม่คาดฝันและจริงจังพูดคุณจะไม่ค่อยหากเคยจำเป็นต้องดัชนีการเข้าถึงอื่น ๆกว่าของตัวแปรอาร์เรย์0
${BASH_SOURCE[@]}
BASH_SOURCE
ถูกเพิ่มที่ bash-3.0-alpha คุณอาจไม่มีขึ้นอยู่กับระบบการทดสอบของคุณ ฉันพบว่ามันหายไปทั้งใน Solaris และ OS X รุ่นแรกดูผลตอบแทน: สามารถ `` ย้อนกลับ 'จากฟังก์ชันหรือสคริปต์ที่มาใน U & L.SE เท่านั้น