นี่เป็นกฎ "ราวกับว่า"
ใส่เพียง: พฤติกรรมของเชลล์ตามที่ผู้ใช้เห็นว่ามันไม่ควรเปลี่ยนแปลงหากการดำเนินการตัดสินใจที่จะทำให้คำสั่งภายนอกมาตรฐานยังมีอยู่ในตัวเชลล์
ความแตกต่างที่ฉันแสดงให้เห็นที่/unix//a/496291/5132ระหว่างพฤติกรรมของ (ในมือข้างหนึ่ง) PD Korn, MirBSD Korn และหอย Heirloom Bourne; (ในทางกลับกัน) Z, 93 Korn, Bourne Again และ Debian Almquist shells; และ (ในมือที่จับได้) เปลือกวาตานาเบะเน้นเรื่องนี้
สำหรับเปลือกหอยที่ไม่ได้printfเป็นในตัวออก/usr/binจากการPATHทำให้การภาวนาของprintfหยุดทำงาน พฤติกรรมที่สอดคล้องกับ POSIX ซึ่งแสดงโดยเปลือกวาตานาเบะในโหมดที่เข้ากันได้ทำให้เกิดผลลัพธ์ที่เหมือนกัน พฤติกรรมของเชลล์ที่มีprintfอยู่แล้วภายในจะเหมือนกับว่าถูกเรียกใช้คำสั่งภายนอก
ในขณะที่พฤติกรรมของเชลล์ที่ไม่สอดคล้องทั้งหมดจะไม่เปลี่ยนแปลงหาก/usr/binถูกลบออกจากPATHและพวกเขาจะไม่ทำงานเหมือนกับว่าพวกเขาถูกเรียกใช้คำสั่งภายนอก
สิ่งที่มาตรฐานพยายามรับประกันให้คุณคือเชลล์สามารถสร้างคำสั่งภายนอกได้ทุกประเภท (หรือใช้มันเป็นฟังก์ชั่นเชลล์ของตัวเอง) และคุณจะยังคงได้รับพฤติกรรมเดียวกันจากบิวด์อินเช่นที่คุณทำ ด้วยคำสั่งภายนอกหากคุณปรับPATHเพื่อหยุดคำสั่งจากการถูกพบ PATHยังคงเป็นเครื่องมือในการเลือกและควบคุมคำสั่งที่คุณสามารถเรียกใช้
(ตามที่อธิบายไว้ที่/unix//a/448799/5132หลายปีก่อนผู้คนเลือกบุคลิกภาพของ Unix ของพวกเขาโดยการเปลี่ยนสิ่งที่เกิดPATHขึ้น)
อาจมีความคิดเห็นที่ทำให้คำสั่งทำงานโดยไม่คำนึงถึงว่าสามารถพบได้PATH ในความเป็นจริงจุดของการสร้างคำสั่งภายนอกตามปกติในตัว (นั่นเป็นสาเหตุที่ชุดเครื่องมือ nosh ของฉันเพิ่งได้printenvรับคำสั่งในตัวในเวอร์ชัน 1.38 จริง ๆ แล้วแม้ว่านี่ไม่ใช่เชลล์)
แต่มาตรฐานจะให้การรับประกันกับคุณว่าคุณจะเห็นพฤติกรรมแบบเดียวกันสำหรับคำสั่งภายนอกทั่วไปที่ไม่ได้อยู่PATHในเชลล์คุณจะเห็นจากโปรแกรมอื่นที่ไม่ใช่เชลล์ที่เรียกใช้execvpe()ฟังก์ชันและเชลล์จะไม่สามารถใช้เวทมนตร์ได้อย่างน่าอัศจรรย์ รัน (เห็นได้ชัด) คำสั่งภายนอกธรรมดาที่โปรแกรมอื่น ๆ PATHที่ไม่สามารถหาด้วยเหมือนกัน ทุกอย่างทำงานด้วยตนเองอย่างสม่ำเสมอจากมุมมองของผู้ใช้และPATHเป็นเครื่องมือสำหรับควบคุมวิธีการทำงาน
อ่านเพิ่มเติม