ใน Linux ขณะพิมพ์คำสั่งหากคุณกด TAB สองครั้ง คำสั่งนั้นจะแสดงรายการคำสั่งทั้งหมดที่ขึ้นต้นด้วยอักขระที่พิมพ์
นี่ไม่ใช่สิ่งใหม่ คุณอาจจะรู้อยู่แล้วเกี่ยวกับเรื่องนี้ ฟังก์ชันนี้เรียกว่า bash เสร็จสิ้น การเติมไฟล์พื้นฐานและชื่อไดเร็กทอรีให้สมบูรณ์มีให้ใช้งานโดยค่าเริ่มต้นในบรรทัดคำสั่ง bash
แต่เราสามารถเทอร์โบชาร์จการเสร็จสิ้นการทุบตีนี้ และนำไปสู่ระดับถัดไปโดยใช้คำสั่งที่สมบูรณ์
บทช่วยสอนนี้อธิบายวิธีที่เราสามารถใช้การเติมข้อความอัตโนมัติกับตัวเลือกและอาร์กิวเมนต์ของคำสั่งโดยใช้การเติมข้อมูลที่ตั้งโปรแกรมได้
ตัวอย่างเช่น หลังจากพิมพ์คำสั่งเขียน หากคุณกดแท็บสองครั้ง การเติมข้อความอัตโนมัติจะแสดงรายชื่อผู้ใช้ เพื่อดำเนินการเขียนการดำเนินการ
$ write [TAB][TAB] bala raj jason randy john ritu mayla thomas nisha www-data
ในตัวอย่างต่อไปนี้ มันจะแสดงชื่อโฮสต์ที่ใช้ได้สำหรับคำสั่ง telnet:
$ telnet [TAB][TAB] localhost dev-db fileserver
ในการทำให้โปรแกรมเสร็จสิ้นในเทอร์มินัลของคุณ คุณเพียงแค่เรียกใช้ /etc/bash_completion ดังที่แสดงด้านล่าง
# . /etc/bash_completion
คุณยังสามารถยกเลิกหมายเหตุบรรทัดด้านล่างใน /etc/bash.bashrc(จาก ubuntu linux 13.04) เพื่อที่คุณจะได้ไม่ต้องเรียกใช้คำสั่งด้านบนอย่างชัดเจน
enable bash completion in interactive shells if ! shopt -oq posix; then if [ -f /usr/share/bash-completion/bash_completion ]; then . /usr/share/bash-completion/bash_completion elif [ -f /etc/bash_completion ]; then . /etc/bash_completion fi fi
ในกรณีที่คุณไม่พบบรรทัดเหล่านี้และไฟล์ /etc/bash_completion คุณเพียงแค่ต้องติดตั้งแพ็คเกจที่เรียกว่า bash_completion โดย apt-get
1. ดูการเสร็จสิ้น bash ที่มีอยู่
หลังจากเปิดใช้งานการเสร็จสิ้น bash ที่ตั้งโปรแกรมได้ จะมีชุดของ bash ที่สมบูรณ์ที่กำหนดไว้ คำสั่งสมบูรณ์ใช้สำหรับกำหนด bash เสร็จสิ้น
หากต้องการดูการเสร็จสิ้นของ bash ที่มีอยู่ ให้ใช้คำสั่งที่สมบูรณ์ดังที่แสดงด้านล่าง
complete -p | less
Option -p เป็นทางเลือกในตัวอย่างด้านบน
2. รายการความสมบูรณ์มาตรฐานใน Bash
Bash จัดเตรียมความสมบูรณ์มาตรฐานต่อไปนี้สำหรับผู้ใช้ Linux โดยค่าเริ่มต้น
- การเติมชื่อตัวแปร
- กรอกชื่อผู้ใช้
- การกรอกชื่อโฮสต์
- การกรอกชื่อเส้นทาง
- การกรอกชื่อไฟล์
เราได้พูดถึงสิ่งเหล่านี้ในบทความการเสร็จสิ้นมาตรฐาน bash ก่อนหน้านี้
3. กำหนดความสมบูรณ์สำหรับการรับคำสั่ง
กำหนดความสมบูรณ์ด้วยคำสั่ง -c เพื่อรับรายการคำสั่งที่มีอยู่เป็นอาร์กิวเมนต์ ในตัวอย่างต่อไปนี้ จะกำหนดความสมบูรณ์สำหรับคำสั่งใด
$ complete -c which $ which [TAB][TAB] Display all 2116 possibilities? (y or n)
ดังที่แสดงด้านบน เมื่อกด 'y' คำสั่งทั้งหมดจะแสดงรายการ
4. กำหนดความสมบูรณ์สำหรับการรับไดเร็กทอรี
ด้วยตัวเลือก d คุณสามารถกำหนดความสมบูรณ์เพื่อรับเฉพาะชื่อไดเร็กทอรีเป็นอาร์กิวเมนต์ ในตัวอย่างต่อไปนี้ กำหนดความสมบูรณ์สำหรับ ls
$ ls countfiles.sh dir1/ dir2/ dir3/ $ complete -d ls $ ls [TAB][TAB] dir1/ dir2/ dir3/
ดังที่แสดงด้านบน การกด tab จะแสดงเฉพาะไดเรกทอรีเท่านั้น
5. กำหนดความสมบูรณ์เพื่อรับชื่องานในพื้นหลัง
เมื่อสมบูรณ์แล้ว ก็ยังสามารถรับชื่องานเป็นอาร์กิวเมนต์ของคำสั่งได้ ตัวเลือก j ใช้สำหรับส่งชื่องานเป็นอาร์กิวเมนต์ไปยังงานคำสั่งดังที่แสดงด้านล่าง
$ jobs [1]- Stopped cat [2]+ Stopped sed 'p' $ complete -j ./list_job_attrib.sh $ ./list_job_attrib.sh [TAB][TAB] cat sed
เมื่อพูดถึงงานเบื้องหลัง คุณควรรู้วิธีจัดการงานพื้นหลังของ Linux โดยใช้ตัวอย่างเหล่านี้
6. เติมคำนำหน้าและคำต่อท้าย
สามารถกำหนดความสมบูรณ์ด้วยคำนำหน้าที่ต้องการเพิ่มและส่วนต่อท้ายเพื่อผนวกกับความสำเร็จจริง ในตัวอย่างต่อไปนี้ คำนำหน้าและส่วนต่อท้ายถูกกำหนดไว้สำหรับ list_job_attrib.sh
$ jobs [1]+ Stopped cat $ complete -P '">' -S '<"' ./list_job_attrib.sh $ ./list_job_attrib.sh [TAB][TAB] $ ./list_job_attrib.sh ">cat<"
7. ชื่อไฟล์และไดเรกทอรีเสร็จสมบูรณ์พร้อมการยกเว้น
พิจารณาว่าสคริปต์ทำงานเสร็จสิ้น เอาต์พุตถูกเขียนไปยังไดเร็กทอรีเอาต์พุตดังนี้
$ cd output/ $ ls all_calls.txt incoming_calls.txt outgoing_calls.txt missed_calls.txt parser_mod.tmp extract.o
ในข้างต้น หากคุณต้องการละเว้นไฟล์ .tmp และ .o สำหรับการเติมข้อความอัตโนมัติด้วยคำสั่ง ls
$ export FIGNORE='.tmp:.o' $ complete -f -d ls $ cd output $ ls [TAB][TAB] all_calls.txt incoming_calls.txt outgoing_calls.txt missed_calls.txt
FIGNORE เป็นตัวแปรของเชลล์ที่มีส่วนต่อท้ายของชื่อไฟล์และไม่ได้รับการยกเว้นในการเติมข้อความอัตโนมัติ
8. แยกสตริงโดย IFS เพื่อรับค่าเสร็จสิ้น
รายการคำศัพท์สามารถกล่าวถึงด้วยตัวเลือก -W และจะถูกแยกด้วยค่าในตัวแปร IFS จากนั้นคำผลลัพธ์แต่ละคำจะถูกขยายและจะแสดงให้เสร็จสิ้น
$ export IFS=" " $ complete -W "bubble quick" ./sort_numbers.sh $ ./sort_numbers.sh [TAB][TAB] bubble quick
ตามที่ระบุไว้ข้างต้น หลังจากแยกสตริงด้วยตัวคั่น IFS แล้ว คำจะขยายออก ดังนั้นจึงเป็นไปได้ที่จะมีสิ่งเหล่านี้เป็นตัวแปรดังที่แสดงด้านล่าง
$ echo $SORT_TYPE1 bubble $ echo $SORT_TYPE2 quick $ complete -W "$SORT_TYPE1 $SORT_TYPE2" ./sort_numbers.sh $ ./sort_numbers.sh [TAB][TAB] bubble quick
9. เขียนฟังก์ชันของคุณเองเพื่อสร้างความสมบูรณ์
ช่วยให้คุณสามารถรวมฟังก์ชันเพื่อกำหนดความสมบูรณ์ได้ ด้วยตัวเลือก -F ชื่อฟังก์ชันที่ส่งผ่านไปยังคำสั่งที่สมบูรณ์ และได้รับการดำเนินการเพื่อสร้างความสมบูรณ์ ตัวอย่างเช่น ฟังก์ชั่นถูกเขียนตามที่แสดงด้านล่าง
_parser_options() { local curr_arg; curr_arg=${COMP_WORDS[COMP_CWORD]} COMPREPLY=( $(compgen -W '-i --incoming -o --outgoing -m --missed' -- $curr_arg ) ); }
ซึ่งในฟังก์ชันข้างต้น
- COMPREPLY :อาร์เรย์เก็บผลการสำเร็จที่แสดงหลังจากกด [TAB][TAB]
- COMP_WORDS :อาร์เรย์ของคำที่พิมพ์บนบรรทัดคำสั่ง
- COMP_CWORD :สามารถเข้าถึงดัชนีสำหรับอาร์เรย์ COMP_WORDS และการใช้คำตำแหน่งที่แตกต่างกันนี้ในบรรทัดคำสั่งได้
- compgen :-W เก็บค่าความสมบูรณ์ที่เป็นไปได้และเลือกอาร์กิวเมนต์ที่เกี่ยวข้องตาม $current_arg
ฟังก์ชันนี้มีอยู่ในไฟล์ parser_option ได้รับแหล่งที่มาดังที่แสดงด้านล่าง
$ source parser_option
เชื่อมโยงฟังก์ชันนี้กับสคริปต์ parser ของคุณดังที่แสดงด้านล่าง
$ complete -F _parser_options ./parser.pl $ ./parser.pl [TAB][TAB] -i --incoming -o --outgoing -m --missed
ตามที่เห็นด้านบน ตัวเลือกสำหรับ parsers ถูกสร้างขึ้นโดยฟังก์ชัน _parser_options()
หมายเหตุ :ดูที่ /etc/bash_completion เพื่อดูฟังก์ชันเพิ่มเติมสำหรับการตั้งโปรแกรมให้เสร็จสิ้น
10. ข้อมูลจำเพาะรองเมื่ออุปกรณ์หลักไม่สร้างใดๆ
หากไม่มีการจับคู่ที่สร้างขึ้นโดยข้อกำหนดการเสร็จสิ้นที่กำหนดไว้ จะมีการใช้ comp-option สำหรับการเสร็จสิ้นที่กล่าวถึงด้วยตัวเลือก -o
$ complete -F _count_files -o dirnames ./countfiles.sh
ดังที่กล่าวข้างต้น ความสมบูรณ์ถูกกำหนดด้วยฟังก์ชัน _count_files สำหรับไฟล์ ./countfiles.sh หากฟังก์ชัน _count_files() ไม่สร้างการจับคู่ใดๆ ระบบจะพยายามทำให้ไดเรกทอรีเสร็จสมบูรณ์
$ ls countfiles.sh dir1/ dir2/ dir3/ $./countfiles.sh [TAB][TAB] dir1 dir2 dir3