ช่วงนี้ฉันใช้เวลาส่วนใหญ่ในเชลล์และฉันสงสัยว่าการเติมข้อความอัตโนมัติของแท็บทำงานอย่างไร กลไกเบื้องหลังคืออะไร? bash รู้เนื้อหาของทุกไดเร็กทอรีได้อย่างไร?
ช่วงนี้ฉันใช้เวลาส่วนใหญ่ในเชลล์และฉันสงสัยว่าการเติมข้อความอัตโนมัติของแท็บทำงานอย่างไร กลไกเบื้องหลังคืออะไร? bash รู้เนื้อหาของทุกไดเร็กทอรีได้อย่างไร?
คำตอบ:
การเติมข้อความอัตโนมัติมีสองส่วน:
ไลบรารี readline ดังที่ได้กล่าวไปแล้วโดย fixje จัดการการแก้ไขบรรทัดคำสั่งและเรียกกลับไปที่ bash เมื่อกดแท็บเพื่อเปิดใช้งานการเสร็จสิ้น จากนั้น Bash จะให้ (ดูจุดต่อไป) รายการความสมบูรณ์ที่เป็นไปได้และ readline แทรกอักขระให้มากที่สุดเท่าที่ระบุไว้อย่างไม่น่าสงสัยโดยอักขระที่พิมพ์ไว้แล้ว (คุณสามารถกำหนดค่าไลบรารี readline ได้ค่อนข้างมากโปรดดูส่วนการแก้ไขบรรทัดคำสั่งของ Bash คู่มือสำหรับรายละเอียด)
Bash เองมีในตัวcomplete
เพื่อกำหนดกลไกการทำให้สมบูรณ์สำหรับแต่ละคำสั่ง หากไม่มีการกำหนดคำสั่งสำหรับคำสั่งปัจจุบันคำสั่งนี้จะใช้การทำให้สมบูรณ์ตามชื่อไฟล์ (โดยใช้ opendir / readdir ตามที่ Ignacio กล่าว)
ส่วนในการกำหนดความสำเร็จของคุณเองได้อธิบายไว้ในส่วนของโปรแกรมได้แล้วเสร็จ ในระยะสั้นเมื่อ
complete «options» «command»
คุณกำหนดความสมบูรณ์สำหรับบางคำสั่ง ยกตัวอย่างเช่นcomplete -u su
กล่าวว่า
เมื่อเสร็จสิ้นการโต้แย้งด้วยsu
คำสั่งค้นหาผู้ใช้ของระบบปัจจุบัน
หากสิ่งนี้ซับซ้อนเกินกว่าที่ตัวเลือกปกติจะครอบคลุมได้ (เช่นความสมบูรณ์ที่แตกต่างกันขึ้นอยู่กับดัชนีอาร์กิวเมนต์หรือขึ้นอยู่กับอาร์กิวเมนต์ก่อนหน้านี้) คุณสามารถใช้-F function
ซึ่งจะเรียกใช้ฟังก์ชันเชลล์เพื่อสร้างรายการความสำเร็จที่เป็นไปได้ (ตัวอย่างนี้ใช้สำหรับการเติมคอมไพล์ซึ่งมีความซับซ้อนมากขึ้นอยู่กับคำสั่งย่อยและบางครั้งก็ขึ้นอยู่กับตัวเลือกที่กำหนดและบางครั้งก็ใช้ชื่อกิ่งก้าน (ซึ่งไม่มีอะไรที่ bash รู้)
คุณสามารถแสดงรายการความสำเร็จที่มีอยู่ที่กำหนดไว้ในสภาพแวดล้อม bash ปัจจุบันของคุณโดยใช้เพียงcomplete
เพื่อให้มีความประทับใจในสิ่งที่เป็นไปได้ หากคุณติดตั้งแพ็กเกจ bash-complete (หรืออย่างไรก็ตามมีการตั้งชื่อบนระบบของคุณ) การติดตั้งเสร็จสมบูรณ์สำหรับคำสั่งจำนวนมากจะถูกติดตั้งและตามที่ Wrikken กล่าวว่า/etc/bash_completion
มีสคริปต์ทุบตีซึ่งมักจะถูกเรียกใช้เมื่อเริ่มต้นเชลล์เพื่อกำหนดค่านี้ อาจมีการวางสคริปต์การเติมเต็มแบบกำหนดเองเพิ่มเติมไว้ใน/etc/bash_completion.d
; /etc/bash_completion
ผู้ที่มีที่มาจากทุก
หากคุณสนใจในพื้นฐาน: Bash ใช้readlineซึ่งมีประวัติและความสมบูรณ์พื้นฐาน คุณสามารถตรวจสอบแหล่งที่มาได้หากต้องการทำความเข้าใจโดยละเอียด นอกจากนี้คุณสามารถใช้ readline เพื่อสร้างอินเทอร์เฟซ CLI ของคุณเองได้
/etc/bash_completion
(อย่างน้อยนั่นคือจุดที่มีเวทมนตร์มากมายใน Debian)