แหล่งที่มากับ ทำไมพฤติกรรมที่แตกต่างกันอย่างไร


17

ฉันเพิ่งเรียนรู้ว่า

. ./.a.aและ./.a.aเหมือนกัน

อย่างไรก็ตามการพยายามsource source .a.aให้ข้อผิดพลาด IMO .การเป็นคนทุบตีแทนsourceไม่ควรทำตัวแตกต่างดังนั้นฉันจะพลาดอะไรไป?

โบนัสทำไม. .ตกลงในขณะที่source sourceไม่?


8
คุณสามารถเลือกชื่อที่ชัดเจนสำหรับตัวอย่างของคุณ :) ไม่ว่าในกรณีใดอะไรก็ตามที่ทำให้คุณมีความคิดเช่นนั้น. scriptและ./scriptเป็นสิ่งเดียวกัน พวกเขามากที่สุดอย่างแน่นอนไม่ได้ นอกจากนี้ไม่ได้เป็นชื่อแทน. sourceมันเป็นวิธีอื่น ๆ .เป็นมาตรฐานและเป็นนามแฝงของsource .
terdon

2
หลังจากใช้เวลาดูเชลล์สคริปต์คุณจะคุ้นเคยกับ.คำสั่ง แต่ฉันหมายความว่าsourceมันเป็นคำสั่งที่ดีกว่าเมื่อคุณเห็นsource somefileสคริปต์คุณรู้ได้ทันทีว่าคำสั่งนั้นทำอะไร แต่. somefile ไม่เพียง แต่ไม่ชัดเจนว่ามันทำอะไร คุณสามารถคิดถึง. ตัวละครทั้งหมดได้อย่างง่ายดาย
the_velour_fog

โบนัสทำไม . ตกลงในขณะที่แหล่งที่มาไม่ได้? - ในวิธีการห่างไกลข้อผิดพลาดbash: .: .: is a directoryเกี่ยวกับ. .เป็นความต้องการตกลงที่จะอธิบายได้
ตอบโต้

@terdon - ถูกต้องแน่นอน ตัวอย่างดั้งเดิมคือความ. ./.a.a .ซื่อสัตย์ : -DA แบบทดสอบแปลก ๆ ถ้าคุณจะ :-) คำถามที่เชื่อมโยงนั้นยอดเยี่ยมขอบคุณมาก สิ่งที่ทำให้ผมมีความคิดที่ว่า: ความจริงที่ว่าฉันได้เห็นความแตกต่างในการดำเนินไฟล์วิธีนี้และความจริงที่ผมอ่านบางไม่เป็นนามแฝงสำหรับ. source:-)
LAFK พูดว่า Reinstate Monica

คำตอบ:


27

คุณไม่สามารถแทนที่.ด้วยsourceทุกที่ ถ้า

. ./.a.a

ทำงานได้คุณสามารถแทนที่งานแรก.(อย่างน้อยใน Bash):

source ./.a.a

ที่สอง.หมายถึงไดเรกทอรีปัจจุบันคุณไม่สามารถแทนที่ด้วยsource(โดยเฉพาะอย่างยิ่งไม่ได้./กับการsourceที่คุณได้ทำ)

source source

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

นอกจากนี้รูปแบบที่สองจะทำงานในเชลล์แยกต่างหาก. ./.a.aและ./.a.aไม่เหมือนกัน .a.aดูความแตกต่างระหว่างการจัดหา ('.' หรือ 'แหล่งที่มา') กับการดำเนินการไฟล์ใน bash คืออะไร สำหรับรายละเอียด


9

sourceเป็นคีย์เวิร์ดของเชลล์ที่ควรจะใช้เช่นนี้: sourcefileที่ไหนfileมีคำสั่งเชลล์ที่ถูกต้อง คำสั่งเชลล์เหล่านี้จะถูกดำเนินการในเชลล์ปัจจุบันราวกับว่าพิมพ์จากบรรทัดคำสั่ง ตอนนี้.fileทำสิ่งเดียวกัน

นอกเหนือจากนั้น.เพียงอย่างเดียวหมายถึง "ไดเรกทอรีการทำงานปัจจุบัน" ใน./xyz(" xyzในไดเรกทอรีนี้") หรือa/b/./c/./d(ซึ่งเหมือนกันa/b/c/d)

นอกเหนือจากที่.อยู่ในชื่อไฟล์มีความหมายโดยการประชุมตาม.foobarที่ระบุไฟล์ "ซ่อน" (ไม่ได้จริงๆ ... ) หรือในfoobar.pdfซึ่งบ่งชี้รูปแบบไฟล์โดยคำต่อท้าย (ที่นี่.pdf)

ความหมายที่แตกต่างเหล่านี้ไม่สามารถแลกเปลี่ยน


8
.ไม่มีทางล้าสมัย ซึ่งแตกต่างจากsourceวิธีพกพาซึ่งเป็นวิธีที่POSIX กำหนดในการจัดหาไฟล์ sourceนามแฝงเป็นเปลือกที่เฉพาะเจาะจงและสามารถจะขาดอย่างใดอย่างหนึ่ง (เช่นในdash) .หรือมีพฤติกรรมที่แตกต่างจากมาตรฐาน
terdon

ขอบคุณ @terdon, Wikiบอกว่าแหล่งที่มาเป็นจุด (.) นั้นไม่สามารถยอมรับได้ใน C เชลล์ซึ่งคำสั่งปรากฏครั้งแรก
Noam Manos

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