เหตุผลสำหรับ/
กฎ POSIX PATH
กฎถูกกล่าวถึงที่: ทำไมคุณต้อง. / (dot-slash) ก่อนที่จะปฏิบัติการหรือชื่อสคริปต์เพื่อเรียกใช้ในทุบตี? แต่ฉันอยากจะอธิบายว่าทำไมฉันถึงคิดว่ามันเป็นรายละเอียดที่ดีมาก
อันดับแรกกฎเวอร์ชันเต็มอย่างชัดเจนคือ:
- ถ้าเส้นทางประกอบด้วย
/
(เช่น./someprog
, /bin/someprog
, ./bin/someprog
): CWD และใช้เส้นทางไม่
- หากเส้นทางไม่มี
/
(เช่นsomeprog
): ใช้เส้นทางและ CWD ไม่ได้
ตอนนี้สมมติว่าการทำงาน:
someprog
จะค้นหา:
- สัมพันธ์กับ CWD ก่อน
- สัมพันธ์กับ PATH หลังจาก
จากนั้นหากคุณต้องการหนี/bin/someprog
จากความวุ่นวายและคุณได้:
someprog
บางครั้งอาจใช้งานได้ แต่บางโปรแกรมอาจล้มเหลวเนื่องจากคุณอาจอยู่ในไดเรกทอรีที่มีsomeprog
โปรแกรมอื่นที่ไม่เกี่ยวข้อง
ดังนั้นในไม่ช้าคุณจะได้เรียนรู้ว่าสิ่งนี้ไม่น่าเชื่อถือและคุณจะจบลงด้วยการใช้พา ธ สัมบูรณ์เมื่อคุณต้องการใช้ PATH ดังนั้นการเอาชนะวัตถุประสงค์ของ PATH
นี่คือสาเหตุที่การมีเส้นทางสัมพัทธ์ใน PATH ของคุณเป็นความคิดที่แย่จริงๆ ฉันมองไปที่คุณnode_modules/bin
ในทางกลับกันสมมติว่าการทำงาน:
./someprog
จะค้นหา:
- สัมพันธ์กับ PATH ก่อน
- สัมพันธ์กับ CWD หลัง
จากนั้นหากคุณเพิ่งดาวน์โหลดสคริปต์someprog
จากที่เก็บ git และต้องการเรียกใช้จาก CWD คุณจะไม่แน่ใจว่านี่เป็นโปรแกรมจริงที่จะทำงานเพราะบางที distro ของคุณอาจมี:
/bin/someprog
ซึ่งอยู่ในเส้นทางของคุณจากแพคเกจที่คุณติดตั้งหลังจากดื่มมากเกินไปหลังจากคริสต์มาสปีที่แล้ว
ดังนั้นอีกครั้งคุณจะถูกบังคับให้เรียกใช้สคริปต์ท้องถิ่นสัมพันธ์กับ CWD ด้วยเส้นทางแบบเต็มเพื่อทราบว่าคุณกำลังทำงานอะไร:
"$(pwd)/someprog"
ซึ่งจะน่ารำคาญอย่างยิ่งเช่นกัน
กฎอีกข้อที่คุณอาจถูกล่อลวงให้คิดขึ้นมาคือ:
พา ธ สัมพันธ์ใช้ PATH เท่านั้น, พา ธ สัมบูรณ์เท่านั้น CWD
"$(pwd)/someprog"
แต่อีกครั้งนี้ผู้ใช้กองกำลังที่จะมักจะใช้เส้นทางที่แน่นอนสำหรับสคริปต์ที่ไม่ใช่เส้นทางที่มี
/
กฎการค้นหาเส้นทางให้บริการที่ง่ายต่อการจดจำวิธีการแก้ปัญหาเกี่ยวกับ:
- เครื่องหมายทับ: ไม่ต้องใช้
PATH
- ไม่ทับ: ใช้เฉพาะ
PATH
ซึ่งทำให้มันง่ายมากที่จะรู้ว่าคุณกำลังใช้งานอะไรอยู่เสมอโดยอาศัยความจริงที่ว่าไฟล์ในไดเรกทอรีปัจจุบันสามารถแสดงเป็น./somefile
หรือsomefile
ดังนั้นจึงให้ความหมายพิเศษกับหนึ่งในนั้น
บางครั้งน่ารำคาญเล็กน้อยที่คุณไม่สามารถค้นหาsome/prog
ความสัมพันธ์ได้PATH
แต่ฉันไม่เห็นวิธีแก้ปัญหาที่ถูกต้อง