อ้างถึงไฟล์ที่สัมพันธ์กับการเรียกใช้สคริปต์


97

ในสคริปต์ทุบตีที่ฉันเขียนฉันใช้sourceเพื่อรวมตัวแปรที่กำหนดไว้ในไฟล์คอนฟิกูเรชัน สคริปต์ที่จะดำเนินการคือact.shในขณะที่สคริปต์ที่จะsourced เป็นact.conf.shดังนั้นในact.shฉันมี:

source act.conf.sh

อย่างไรก็ตามสิ่งนี้ใช้ได้เฉพาะเมื่อทำงานact.shในไดเร็กทอรีที่มีอยู่เนื่องจากact.conf.shมีการอ้างถึงไฟล์ที่อยู่ภายใต้ไดเร็กทอรีการทำงาน มีวิธีแก้ไขให้อ้างถึงไฟล์ที่สัมพันธ์กับสคริปต์การเรียกใช้งานโดยไม่ต้องเรียกใช้cdหรือไม่? ขอบคุณ.

คำตอบ:


121

ดู: รายการคำถามที่พบบ่อย BASH # 28: "ฉันจะกำหนดตำแหน่งของสคริปต์ของฉันได้อย่างไรฉันต้องการอ่านไฟล์กำหนดค่าบางไฟล์จากที่เดียวกัน"

วิธีแก้ปัญหาใด ๆ จะไม่ทำงาน 100% ของเวลา:

สิ่งสำคัญคือต้องตระหนักว่าในกรณีทั่วไปปัญหานี้ไม่มีทางแก้ไข แนวทางใด ๆ ที่คุณอาจเคยได้ยินและแนวทางใด ๆ ที่จะมีรายละเอียดด้านล่างนี้มีข้อบกพร่องและจะใช้ได้ผลในบางกรณีเท่านั้น ก่อนอื่นพยายามหลีกเลี่ยงปัญหาทั้งหมดโดยไม่ขึ้นอยู่กับตำแหน่งของสคริปต์ของคุณ!

หากคุณจำเป็นต้องเขียนมากเครื่องมือที่นำมาใช้ใหม่แล้วการเส้นทางที่ถูกต้องเป็นพารามิเตอร์สคริปต์ของคุณจะเป็นวิธีการที่น่าเชื่อถือที่สุด

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

โดยเฉพาะคำถามที่พบบ่อยแนะนำให้หลีกเลี่ยง$0ตัวแปรที่ใช้บ่อยมาก:

ไม่มีสิ่งใดที่อ่านแล้ว$0จะสามารถกันกระสุนได้เพราะ$0ตัวมันเองไม่น่าเชื่อถือ

คุณสามารถใช้$BASH_SOURCEแทนได้อีกทางหนึ่ง สิ่งนี้:

source "${BASH_SOURCE%/*}/act.conf.sh"

มีข้อแม้บางประการสำหรับการแก้ปัญหานี้เช่นกัน ดูหน้าคำถามที่พบบ่อยเพื่อดูการแลกเปลี่ยนระหว่างโซลูชันต่างๆ ดูเหมือนว่าจะแนะนำcdร่วมกับ$BASH_SOURCEในกรณีที่จะได้ผลสำหรับคุณเนื่องจากคุณได้รับเงื่อนไขข้อผิดพลาดที่สะดวกเมื่อขยายไม่ถูกต้อง


1
readlinkขอบคุณผมจะใช้ ไม่สามารถระบุคีย์เวิร์ดที่จะค้นหาได้จึงโพสต์คำถามไว้ที่นี่ ....
Ryan Li

9
คุณสามารถดึงข้อมูลที่เกี่ยวข้องมาเป็นคำตอบได้หรือไม่ในกรณีที่คำถามที่พบบ่อยเกี่ยวกับการทุบตีล้มเหลว
Merlyn Morgan-Graham

3
Link แนะนำ: cd "${BASH_SOURCE%/*}" || exitหรือread somevar < "${BASH_SOURCE%/*}/etc/somefile"Link อย่างยิ่งกีดกัน $0 "ไม่มีสิ่งใดที่อ่านว่า $ 0 จะสามารถกันกระสุนได้เพราะ $ 0 นั้นไม่น่าเชื่อถือ"
ThorSummoner

10
% / * หลังจาก BASH_SOURCE ทำอะไรและทำอย่างไร
Silicomancer


34

ดูสิ่งนี้: Bash: _best_ รวมสคริปต์อื่น ๆ ได้อย่างไร

ฉันแนะนำให้ใช้:

source $(dirname $0)/act.conf.sh

8
นี่ไม่ใช่คำตอบที่คุณต้องการ $0เป็นรถโดยเนื้อแท้ ดูคำตอบที่ได้รับการโหวตและเป็นที่ยอมรับสูงสุดว่าทำไมหรือเพียงแค่อ่านmywiki.wooledge.org/BashFAQ/028 - วิธีแก้ปัญหาสั้น ๆ สำหรับคำถามที่ถามมีดังนี้source "${BASH_SOURCE%/*}/act.conf.sh"
Merlyn Morgan-Graham


1

ฉันมักจะเพิ่มสิ่งนี้ไว้ด้านบนของสคริปต์ของฉัน

cd $(dirname $BASH_SOURCE)

จากนั้นโค้ดที่ตามมาทั้งหมดจะถูกเรียกใช้โดยสัมพันธ์กับพา ธ ของสคริปต์นั้น

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