มาตรฐานเชลล์ POSIX ระบุไว้ในเว็บไซต์นี้
http://pubs.opengroup.org/onlinepubs/9699919799/
เกี่ยวกับวิธีที่ shells ใช้PATH
เพื่อค้นหา executables:
"รายการจะถูกค้นหาตั้งแต่ต้นจนจบนำชื่อไฟล์ไปใช้กับแต่ละคำนำหน้าจนกว่าจะพบไฟล์ปฏิบัติการที่มีชื่อที่ระบุและพบการอนุญาตการใช้งานที่เหมาะสม"
นี่ไม่ใช่ลักษณะที่ปรากฏในการใช้งาน POSIX จริง:
man which
พูดว่า:
"ส่งคืนชื่อพา ธ ของไฟล์ (หรือลิงก์) ซึ่งจะถูกดำเนินการในสภาพแวดล้อมปัจจุบันได้รับข้อโต้แย้งเป็นคำสั่งในเชลล์ที่สอดคล้องกับ POSIX อย่างเคร่งครัดมันทำสิ่งนี้โดยการค้นหา PATH สำหรับไฟล์ปฏิบัติการที่ตรงกับชื่อของ อาร์กิวเมนต์มันไม่ได้ติดตามลิงก์สัญลักษณ์ "
ตกลงเรามาดูสถานการณ์นี้กัน:
$ pwd
/home/mark
$ echo $PATH
/home/mark/bin:
...
$ ls -l bin/foobar
lrwxrwxrwx 1 mark mark 18 Dec 12 22:51 bin/foobar -> /home/mark/foobar1
$ touch foobar1
$ which foobar
$ chmod a+x foobar1
$ which foobar
/home/mark/bin/foobar
ตกลงนี่คือลิงก์สัญลักษณ์ที่PATH
มีชื่อที่ถูกต้องและมีการรายงานโดยls
ให้เรียกใช้งานได้
which
ไม่ได้ดูเลย แต่สนใจเฉพาะสิ่งที่ชี้ไปเท่านั้น
แม้ว่าจะมีข้อเท็จจริงที่ว่าทั้งคู่man which
บอกอย่างชัดเจนว่ามันไม่ได้เป็นไปตามลิงก์สัญลักษณ์ (และแน่นอนว่าเราไม่เห็นเพราะwhich foobar
ไม่พิมพ์foobar1
) และเอกสาร POSIX เชลล์ที่ยกมาด้านบนไม่เคยกล่าวถึง symlink ในPATH
อัลกอริทึม
ดังนั้นwhich
และเชลล์ที่มีอยู่ผิดหรือฉันไม่เข้าใจเอกสารหรือไม่
เพื่อ CLARIFY:
ฉันรู้และสามารถอธิบายพฤติกรรมที่มีอยู่ คำถามของฉันไม่ใช่ "สิ่งนี้ทำงานอย่างไร" ที่ฉันรู้.
คำถามของฉันเกี่ยวกับเอกสาร: ข้อผิดพลาดของฉันในการติดตามเอกสารที่ฉันยกมา หรือเอกสารผิดหรือเปล่า?
แรงจูงใจ: ทำไมฉันถึงแคร์
ฉันเป็นผู้ดำเนินการ ผู้ใช้งานที่แตกต่างกันมีข้อกำหนดที่แตกต่างกัน สำหรับฉันความต้องการก็คือคำของมาตรฐาน POSIX ปัจจุบันจะต้องปฏิบัติตามอย่างแน่นอน (หรือแม่นยำยิ่งขึ้นดีที่สุดเท่าที่จะทำได้เพราะมาตรฐานตัวเองค่อนข้างจะบั๊กกี้) เหมือนที่เป็นพระวจนะของพระเจ้า
ตอนนี้ถ้อยคำมาตรฐานค่อนข้างชัดเจน - ไม่มีการพูดถึงสัญลักษณ์เชื่อมโยงซึ่งในที่อื่น ๆ อีกหลายแห่งจะมีการกล่าวถึงตำแหน่งที่ต้องทำ ดังนั้นในกรณีนี้อย่า
แต่ผมคู่เสมอตรวจสอบวิธีการdash
และbash
ประพฤติเพียงเพื่อให้แน่ใจว่า ตอนนี้แน่นอนว่ามีปัญหาเล็กน้อยเช่นกันที่นี่dash
แม้ว่าจะถูกเรียกเก็บเงินเป็น POSIX แต่ก็มีข้อบกพร่องเล็ก ๆ มากมายที่สอดคล้องกับ POSIX bash
ฉันยังไม่พบข้อบกพร่องใด ๆ ของ POSIX แต่ ... ทุบตีไม่ได้เป็น POSIX จริง ๆ มันมากกว่านั้น
ดังนั้นคุณมีมัน นั่นคือเหตุผลที่ฉันสนใจ
$PATH
ไม่มีการเชื่อมโยงใด ๆ
lstat(2)
) การติดตามกรณีเหล่านี้มักไม่ได้ระบุไว้ ยกตัวอย่างเช่นคำอธิบายของopen(2)
เพียงกล่าวถึง symlinks O_CREAT | O_EXCL
เมื่อพูดคุยเกี่ยวกับพฤติกรรมของ ไม่จำเป็นต้องระบุว่าจะเปิดไฟล์เป้าหมาย
$PATH
สามารถมี symlink ลองwhich sh
ดู