bash tab complete ทำงานอย่างไร?


113

ช่วงนี้ฉันใช้เวลาส่วนใหญ่ในเชลล์และฉันสงสัยว่าการเติมข้อความอัตโนมัติของแท็บทำงานอย่างไร กลไกเบื้องหลังคืออะไร? bash รู้เนื้อหาของทุกไดเร็กทอรีได้อย่างไร?


2
คุณอาจต้องการตรวจสอบ/etc/bash_completion(อย่างน้อยนั่นคือจุดที่มีเวทมนตร์มากมายใน Debian)
Wrikken

1
@Wrikken: นั่นคือ bash_completion ซึ่งขึ้นอยู่กับความสมบูรณ์ของแท็บ แต่ไม่ค่อยเกิดขึ้น
Ignacio Vazquez-Abrams

4
นอกจากนี้ยังมีคำถามอีกมากมายเกี่ยวกับ * nix stackexchange ได้แก่ : unix.stackexchange.com/questions/4738/… unix.stackexchange.com/questions/1800/custom-autocomplete unix.stackexchange.com/questions/12356/…และที่ อย่างน้อยหนึ่งรายการใน SU: superuser.com/questions/289539/custom-bash-tab-completion
Cascabel

คำตอบ:


101

การเติมข้อความอัตโนมัติมีสองส่วน:

  • ไลบรารี 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ผู้ที่มีที่มาจากทุก


1
หน้า Man มีไว้สำหรับคำสั่งอิสระเท่านั้นไม่ใช่สำหรับเชลล์บิวด์อิน แต่เป็นส่วนหนึ่งของคู่มือทุบตีที่ฉันเชื่อมโยง
Paŭlo Ebermann

7

หากคุณสนใจในพื้นฐาน: Bash ใช้readlineซึ่งมีประวัติและความสมบูรณ์พื้นฐาน คุณสามารถตรวจสอบแหล่งที่มาได้หากต้องการทำความเข้าใจโดยละเอียด นอกจากนี้คุณสามารถใช้ readline เพื่อสร้างอินเทอร์เฟซ CLI ของคุณเองได้

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