นี่เป็นกฎ "ราวกับว่า"
ใส่เพียง: พฤติกรรมของเชลล์ตามที่ผู้ใช้เห็นว่ามันไม่ควรเปลี่ยนแปลงหากการดำเนินการตัดสินใจที่จะทำให้คำสั่งภายนอกมาตรฐานยังมีอยู่ในตัวเชลล์
ความแตกต่างที่ฉันแสดงให้เห็นที่/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
เป็นเครื่องมือสำหรับควบคุมวิธีการทำงาน
อ่านเพิ่มเติม