Eliah ทำหน้าที่ได้ยอดเยี่ยมในการตอบคำถามนี้ แต่ฉันต้องการแสดงความคิดเห็นเกี่ยวกับส่วน "ทำไมจึงมีเวอร์ชั่นecho
แยกต่างหากจากโปรแกรม Bash" นั่นเป็นคำถามที่ผิด
คำถามที่ถูกต้องคือ: ทำไมนี่คือ builtin ในสถานที่แรกเมื่อมันอาจจะเป็น (และเป็น) คำสั่งภายนอกที่ดีอย่างสมบูรณ์?
เพื่อความเรียบง่ายลองดูบิวด์อินในเส้นประที่ 38 อย่างน่ากลัว (bash มี 61 เพื่อเปรียบเทียบโดยไปที่เอาท์พุตcompgen -b
):
. continue getopts readonly type
: echo hash return ulimit
[ eval jobs set umask
alias exec kill shift unalias
bg exit local test unset
break export printf times wait
cd false pwd trap
command fg read true
ต้องสร้างสิ่งเหล่านี้กี่ตัว? [
, echo
, false
, printf
, pwd
, test
และtrue
ไม่ต้องการที่จะเป็น builtins: พวกเขาไม่ได้ทำอะไรที่เฉพาะในตัวสามารถทำ (หรือได้รับผลกระทบต่อรัฐเปลือกที่ไม่สามารถใช้ได้กับคำสั่งภายนอก) ทุบตีของprintf
อย่างน้อยจะได้ประโยชน์จากการเป็น builtin: การบันทึกการส่งออกให้กับตัวแปรprintf -v var
ใน bash ก็มีความพิเศษด้วยการเป็นคีย์เวิร์ดคุณสามารถใช้เวลาในรายการคำสั่งโดยพลการใน bash (เส้นประไม่ได้เทียบเท่า) ไม่จำเป็นต้องเป็นบิวด์อิน - คำสั่งภายนอกใด ๆ จะสืบทอดไดเรกทอรีทำงานปัจจุบัน (และเป็นคำสั่งภายนอกด้วย)var
time
time
pwd
:
เป็นข้อยกเว้น - คุณต้องมี NOP และ:
เป็น ส่วนที่เหลือทำการกระทำที่คำสั่งภายนอกสามารถทำได้อย่างง่ายดาย
ดังนั้นหนึ่งในห้าของสิ่งปลูกสร้างเหล่านี้จึงไม่จำเป็นต้องเป็นตัวสร้าง แล้วทำไม? manpage * จริงอธิบายในการผ่านเหตุผลเหล่านี้เป็น builtins (เหมืองเน้น):dash
builtins
ส่วนนี้แสดงรายการคำสั่ง builtin ซึ่งสร้างขึ้นเพราะ
จำเป็นต้องดำเนินการบางอย่างที่แยกไม่ได้
กระบวนการ. นอกจากนี้ยังมีคำสั่งอื่น ๆ อีกหลายอย่างที่อาจมี
สร้างขึ้นเพื่อประสิทธิภาพ (เช่น printf (1), echo (1), ทดสอบ (1), ฯลฯ )
นั่นเป็นสิ่งที่ค่อนข้างมาก: สิ่งเหล่านี้มีอยู่ภายในเพราะมีการใช้บ่อยครั้งมีการโต้ตอบและในสคริปต์และการทำงานของพวกเขานั้นง่ายพอที่เชลล์สามารถทำงานได้ และเพื่อให้มันเกิดขึ้น: บางคน (ส่วนใหญ่) เปลือกหอยเอาในงาน ** กลับไป. จาก2.9 BSDและคุณจะไม่พบในตัวsh
echo
ดังนั้นมันเป็นไปได้โดยสิ้นเชิงที่เชลล์ขนาดเล็กสามารถข้ามการใช้คำสั่งเช่นบิวด์อิน (ฉันไม่คิดว่าเชลล์ปัจจุบันใดจะทำได้) โครงการ coreutils ของ GNU ไม่คิดว่าคุณจะใช้มันในเชลล์ตัวใดตัวหนึ่งและ POSIX ต้องการคำสั่งเหล่านี้ ดังนั้น coreutils ให้สิ่งเหล่านี้แล้วและข้ามสิ่งที่ไม่มีความหมายใด ๆ นอกเหนือจากเปลือก
* นี่เกือบจะเหมือนกับข้อความ manpage ที่สอดคล้องกันสำหรับ Almquist shellซึ่งเป็นเส้นประที่เชลล์ Debian Almquist ใช้
** zsh
ใช้ความคิดนี้ไปมาก: คำสั่งที่คุณจะได้รับโดยการโหลดโมดูลต่างๆเช่นzmv
, เป็นสิ่งที่คุณจะไม่คิดว่าเปลือกจำเป็นต้องได้รับเข้าไป ณ จุดนี้คำถามที่แท้จริงคือทำไมคุณจะใช้ทุบตีแทน zsh ซึ่งมี builtins เหล่านี้ทั้งหมด