มีบิวด์อินสองชั้น:
คำสั่งบางอย่างจะต้องมีการสร้างไว้ในโปรแกรมเชลล์เพราะมันไม่สามารถทำงานได้หากพวกมันอยู่ภายนอก
cd
เป็นสิ่งหนึ่งเนื่องจากถ้ามันเป็นภายนอกมันสามารถเปลี่ยนไดเรกทอรีของตัวเองเท่านั้น มันไม่สามารถส่งผลกระทบต่อไดเรกทอรีการทำงานปัจจุบันของเชลล์ (ดูเพิ่มเติมที่: ทำไมจึงcd
ไม่ใช่โปรแกรม )
คำสั่งคลาสอื่น ๆ ถูกสร้างไว้ในเชลล์เพื่อประสิทธิภาพอย่างแท้จริง
หน้าคนมีส่วน builtins ซึ่งกล่าวถึง, และเป็นตัวอย่างของคำสั่งในชั้นนี้dash
printf
echo
test
ระบบ Unix ได้รวมโปรแกรมเรียกทำงานแยกต่างหากสำหรับคำสั่งในคลาสที่สองนั้นเสมอ executables แยกเหล่านี้ยังคงมีอยู่ในระบบ Unixy ทุกระบบที่ฉันใช้แม้ว่าจะสร้างไว้ในเชลล์ทุกตัวที่คุณน่าจะใช้ก็ตาม ( POSIXต้องการให้ไฟล์ปฏิบัติการเหล่านี้มีอยู่จริง)
ฉันเชื่อว่าecho
มีการสร้างไว้ในเชลล์ใน AT&T Unix System V Release 3.1 ฐานผมว่าเมื่อเปรียบเทียบสองรุ่นแตกต่างกันของคู่มือสำหรับ AT & Ts 3B1 ชุดระบบ ใครบางคนได้สแกนกรุณา 1,986 ฉบับคู่มือเหล่านี้และทำให้พวกเขาออนไลน์ ; สิ่งเหล่านี้สอดคล้องกับรีลีสดั้งเดิมของ SVR3 คุณจะเห็นว่าไม่ได้echo
อยู่ในรายการในหน้า 523 ของคู่มือผู้ใช้ UNIX System V, Volume IIที่คุณคาดหวังหากคำสั่งนั้นถูกสร้างไว้ในเชลล์ ในกระดาษท้องถิ่นของฉันของคู่มือ SVR3.1 จากปี 1987 echo
มีการระบุไว้ในส่วนนี้ของคู่มือ
ฉันค่อนข้างแน่ใจว่านี่ไม่ใช่นวัตกรรมCSRG ของ Berkeley ที่ AT&T นำกลับบ้าน 4.3BSD ออกมาในปีเดียวกับ SVR3, 1986 แต่ถ้าคุณดูmanpage ของ sh.1 4.3BSDคุณจะเห็นว่าecho
มันไม่ได้อยู่ในรายการคำสั่งในตัว "คำสั่งพิเศษ" ของส่วน หาก CSRG ทำเช่นนี้นั่นทำให้เราต้องการแหล่งเอกสารที่จะพิสูจน์มัน
ณ จุดนี้คุณอาจสงสัยว่าecho
มีการสร้างลงในเชลล์ก่อนหน้า SVR3.1 หรือไม่และข้อเท็จจริงนี้ไม่ได้มีการบันทึกไว้จนกว่าจะถึงตอนนั้น pre-SVR3 AT&T Unix ซอร์สโค้ดใหม่ล่าสุดที่มีให้ฉันอยู่ในtarball PDP-11 System IIIซึ่งคุณจะพบซอร์สโค้ดเชลล์บอร์น คุณจะไม่พบecho
ในตารางคำสั่ง builtin /usr/src/cmd/sh/msg.c
ซึ่งอยู่ใน จากการประทับเวลาในไฟล์นั้นพิสูจน์echo
ได้ว่าไม่ได้อยู่ในเชลล์ในปี 1980
เรื่องไม่สำคัญ
ไดเรกทอรีเดียวกันยังมีไฟล์ชื่อbuiltin.c
ที่ไม่มีสิ่งใดตรงประเด็นสำหรับคำถามนี้ แต่เราพบความคิดเห็นที่น่าสนใจนี้:
/*
builtin commands are those that Bourne did not intend
to be part of his shell.
Redirection of i/o, or rather the lack of it, is still a
problem..
*/