คำสั่ง builtin ทำอะไรในการทุบตี?


35

ฉันรู้ว่าคำสั่ง builtin คืออะไร แต่builtinตัวเองทำอะไร? การดำเนินการwhich lsแสดงให้ฉัน/bin/lsแต่การดำเนินการwhich builtinส่งคืนอะไร

man builtinbuiltinเพียงแค่ให้ฉันรายการของคำสั่งในตัวหนึ่งซึ่งเป็น ส่วนที่เหลือของหน้าคนอธิบายสิ่งที่สร้างขึ้น แต่ไม่ได้builtinเป็นอะไร

builtin --helpบอกฉันbuiltin: usage: builtin [shell-builtin [arg ...]]แต่ก็ยังไม่ทำอะไร

มันเป็นส่วนหนึ่งของทุบตีในลักษณะที่คำสั่ง builtin อื่นไม่ได้หรือไม่?


3
help builtinคุณลืม
Ignacio Vazquez-Abrams

3
which builtinไม่มีผลลัพธ์เพราะwhichรายงานสถานที่ตั้งของคำสั่งภายนอก ถ้าคุณขอให้เปลือกมันจะบอกคุณแปลกใจว่าtype builtin builtin is a shell builtinคุณจะพบเช่นเดียวกันกับalias, setฯลฯ
Toby Speight

1
builtin help builtin
theonlygusti

คำตอบ:


50

builtinคำสั่งทำให้แน่ใจว่าคุณใช้เปลือกในตัวรุ่นของคำสั่งแทนที่จะใช้คำสั่งอื่นที่มีชื่อเดียวกัน

ตัวอย่างเช่นสมมติว่าคุณกำหนดฟังก์ชันเชลล์ชื่อcdเพื่อพิมพ์สถานะพิเศษบางอย่างทุกครั้งที่คุณเปลี่ยนไดเรกทอรี แต่คุณทำมันยุ่งและตอนนี้คุณไม่สามารถเปลี่ยนไดเรกทอรีได้อย่างถูกต้อง ดังนั้นตอนนี้คุณสามารถพิมพ์builtin cd ~สำเร็จ cd กลับไปที่โฮมไดเร็กตอรี่ของคุณโดยไม่ต้องรันฟังก์ชั่นเชลล์ที่ใช้งานไม่ได้.

และโดยวิธีการสำเนาของหน้าคนทุบตีของฉันมีส่วนที่เรียกว่า "คำสั่งเปลือกอาคาร" และมันกำหนดความหมายของbuiltinคำสั่งในส่วนนั้น (ถอดความด้านล่าง)

builtin shell-builtin [อาร์กิวเมนต์]

    ดำเนินการเชลล์ในตัวที่ระบุส่งผ่านอาร์กิวเมนต์และ
    คืนสถานะการออก สิ่งนี้มีประโยชน์เมื่อกำหนดฟังก์ชั่น
    ซึ่งมีชื่อเหมือนกับเชลล์บิวด์ในตัว
    ฟังก์ชั่นของ builtin ภายในฟังก์ชั่น cd builtin คือ
    นิยามใหม่ของวิธีนี้โดยทั่วไป

    สถานะการส่งคืนเป็นเท็จถ้า shell-builtin ไม่ใช่ shell builtin
    คำสั่ง

14
คำตอบที่ดี แต่ทำให้ฉันสงสัยว่าคุณจะมั่นใจได้อย่างไรว่าbuiltinคำสั่งนั้นเป็นตัวจริงจากการทุบตี?
Pacopaco

14
@Pacopaco: คุณไม่สามารถ :-) คุณสามารถลบล้างbuiltinได้เช่นกัน: function builtin { echo "Hi from builtin :-)"; }. จากนั้นbuiltinไม่ทำงานอีกต่อไป
sleske

12
@Pacopaco type builtinจะบอกคุณว่ามันเป็นของจริงbuiltinหรือเปล่า เว้นแต่typeจะได้รับการแทนที่ด้วยสิ่งที่ไม่ได้สร้างขึ้นtype...
Toby Speight

10
โอ้ ... น่าเสียดายที่เราสามารถทำได้: alias unset = "echo unset ถูกแทนที่"; alias alias = "echo alias ถูกเขียนทับ" ... ดังนั้นไม่มีโชคที่นี่
Olivier Dulac

8
ฉันรักการสนทนาอย่างต่อเนื่องนี้!
Sam Weaver
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.