Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม BASH

10 ตัวอย่างคำสั่งที่สมบูรณ์ของ Linux Bash_Completion (Bash Command Line Completion บนเตียรอยด์)

ใน 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 โดยค่าเริ่มต้น

  1. การเติมชื่อตัวแปร
  2. กรอกชื่อผู้ใช้
  3. การกรอกชื่อโฮสต์
  4. การกรอกชื่อเส้นทาง
  5. การกรอกชื่อไฟล์

เราได้พูดถึงสิ่งเหล่านี้ในบทความการเสร็จสิ้นมาตรฐาน 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 ) );
}

ซึ่งในฟังก์ชันข้างต้น

  1. COMPREPLY :อาร์เรย์เก็บผลการสำเร็จที่แสดงหลังจากกด [TAB][TAB]
  2. COMP_WORDS :อาร์เรย์ของคำที่พิมพ์บนบรรทัดคำสั่ง
  3. COMP_CWORD :สามารถเข้าถึงดัชนีสำหรับอาร์เรย์ COMP_WORDS และการใช้คำตำแหน่งที่แตกต่างกันนี้ในบรรทัดคำสั่งได้
  4. 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