มาตรฐานเชลล์ 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ดู