Di Linux, saat mengetik perintah jika Anda menekan TAB dua kali, itu akan mencantumkan semua perintah yang tersedia yang dimulai dengan karakter yang diketik.
Ini bukan hal baru, mungkin Anda sudah mengetahuinya. Fungsionalitas ini disebut penyelesaian bash. Penyelesaian nama file dan direktori dasar tersedia secara default di baris perintah bash.
Namun, kita dapat meningkatkan penyelesaian bash ini, dan membawanya ke level berikutnya menggunakan perintah lengkap.
Tutorial ini menjelaskan bagaimana kita dapat menerapkan pelengkapan otomatis ke opsi dan argumen perintah menggunakan penyelesaian yang dapat diprogram.
Misalnya, setelah mengetik perintah tulis, jika Anda menekan tab dua kali, pelengkapan otomatis memberikan daftar pengguna untuk melakukan operasi tulis.
$ write [TAB][TAB] bala raj jason randy john ritu mayla thomas nisha www-data
Dalam contoh berikut, ini akan menampilkan nama host yang tersedia untuk perintah telnet:
$ telnet [TAB][TAB] localhost dev-db fileserver
Untuk mendapatkan penyelesaian yang dapat diprogram di terminal Anda, Anda hanya perlu menjalankan /etc/bash_completion seperti yang ditunjukkan di bawah ini,
# . /etc/bash_completion
Anda juga dapat menghapus komentar pada baris di bawah ini di /etc/bash.bashrc(dari ubuntu linux 13.04) sehingga Anda tidak perlu menjalankan perintah di atas secara eksplisit,
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
Jika Anda tidak menemukan baris ini dan file /etc/bash_completion, maka Anda hanya perlu menginstal paket yang disebut bash_completion oleh apt-get
1. Lihat penyelesaian bash yang ada
Setelah mengaktifkan penyelesaian bash yang dapat diprogram, ada serangkaian penyelesaian bash yang ditentukan. Perintah complete digunakan untuk mendefinisikan penyelesaian bash.
Untuk melihat penyelesaian bash yang ada, gunakan perintah lengkap seperti yang ditunjukkan di bawah ini.
complete -p | less
Opsi -p adalah opsional dalam contoh di atas.
2. Daftar Penyelesaian Standar di Bash
Bash menyediakan penyelesaian standar berikut untuk pengguna Linux secara default.
- Penyelesaian nama variabel
- Nama pengguna selesai
- Penyelesaian nama host
- Penyelesaian nama jalur
- Penyelesaian nama file
Kami membahas tentang ini di artikel penyelesaian standar bash kami sebelumnya.
3. Tentukan Penyelesaian untuk Memperoleh Perintah
Tentukan penyelesaian dengan perintah -c untuk mendapatkan daftar perintah yang tersedia sebagai argumen. Dalam contoh berikut, penyelesaian ditentukan untuk perintah mana,
$ complete -c which $ which [TAB][TAB] Display all 2116 possibilities? (y or n)
Seperti yang terlihat di atas, dengan menekan 'y', semua perintah akan terdaftar.
4. Tentukan Penyelesaian untuk Mendapatkan Direktori
Dengan opsi d, penyelesaian dapat didefinisikan untuk mendapatkan hanya nama direktori sebagai argumen. Dalam contoh berikut, penyelesaian yang ditentukan untuk ls,
$ ls countfiles.sh dir1/ dir2/ dir3/ $ complete -d ls $ ls [TAB][TAB] dir1/ dir2/ dir3/
Seperti yang terlihat di atas, menekan tab hanya menampilkan direktori.
5. Tentukan Penyelesaian untuk Mendapatkan Nama Pekerjaan Latar Belakang
Dengan lengkap, juga dimungkinkan untuk mendapatkan nama pekerjaan sebagai argumen untuk perintah. Opsi j digunakan untuk meneruskan nama pekerjaan sebagai argumen untuk memerintahkan pekerjaan seperti yang ditunjukkan di bawah ini,
$ jobs [1]- Stopped cat [2]+ Stopped sed 'p' $ complete -j ./list_job_attrib.sh $ ./list_job_attrib.sh [TAB][TAB] cat sed
Berbicara tentang pekerjaan latar belakang, Anda juga harus mengetahui cara mengelola pekerjaan latar belakang Linux menggunakan contoh-contoh ini.
6. Penyelesaian dengan Awalan dan Akhiran
Penyelesaian dapat didefinisikan dengan awalan yang diinginkan untuk ditambahkan dan akhiran untuk ditambahkan dengan penyelesaian yang sebenarnya. Dalam contoh berikut, awalan dan akhiran didefinisikan untuk 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. Penyelesaian Nama File dan Direktori dengan Pengecualian
Pertimbangkan bahwa skrip menyelesaikan prosesnya, output ditulis ke direktori output sebagai berikut
$ cd output/ $ ls all_calls.txt incoming_calls.txt outgoing_calls.txt missed_calls.txt parser_mod.tmp extract.o
Di atas, jika Anda perlu mengabaikan file .tmp dan .o untuk pelengkapan otomatis dengan perintah 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 adalah variabel shell yang berisi akhiran nama file dan yang dikecualikan dalam pelengkapan otomatis.
8. Pisahkan String dengan IFS untuk mendapatkan Nilai Penyelesaian
Daftar kata dapat disebutkan dengan opsi -W dan itu akan dibagi dengan nilai dalam variabel IFS. Kemudian setiap kata yang dihasilkan diperluas dan akan ditampilkan untuk diselesaikan,
$ export IFS=" " $ complete -W "bubble quick" ./sort_numbers.sh $ ./sort_numbers.sh [TAB][TAB] bubble quick
Seperti yang dinyatakan di atas, setelah memisahkan string dengan pembatas IFS, kata akan diperluas, jadi juga memungkinkan untuk memiliki ini sebagai variabel seperti yang ditunjukkan di bawah ini,
$ 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. Tulis Fungsi Anda Sendiri untuk Menghasilkan Penyelesaian
Ini memungkinkan Anda untuk memasukkan fungsi untuk menentukan penyelesaian. Dengan opsi -F, nama fungsi diteruskan ke perintah lengkap dan dieksekusi untuk menghasilkan penyelesaian. Misalnya, fungsi ditulis seperti yang ditunjukkan di bawah ini,
_parser_options() { local curr_arg; curr_arg=${COMP_WORDS[COMP_CWORD]} COMPREPLY=( $(compgen -W '-i --incoming -o --outgoing -m --missed' -- $curr_arg ) ); }
dimana pada fungsi di atas,
- COMPREPLY :array menyimpan hasil penyelesaian yang ditampilkan setelah menekan [TAB][TAB]
- COMP_WORDS :deretan kata yang diketik pada baris perintah
- COMP_CWORD :indeks untuk array COMP_WORDS dan menggunakan kata-kata posisi yang berbeda ini pada baris perintah dapat diakses.
- compgen :-W menyimpan kemungkinan penyelesaian dan masing-masing argumen dipilih berdasarkan $current_arg
Fungsi ini hadir dalam file parser_option bersumber seperti yang ditunjukkan di bawah ini,
$ source parser_option
Tautkan fungsi ini ke skrip parser Anda seperti yang ditunjukkan di bawah ini,
$ complete -F _parser_options ./parser.pl $ ./parser.pl [TAB][TAB] -i --incoming -o --outgoing -m --missed
Seperti yang terlihat di atas, opsi untuk parser dihasilkan oleh fungsi _parser_options().
Catatan :Lihat /etc/bash_completion untuk melihat lebih banyak fungsi untuk penyelesaian yang dapat diprogram.
10. Spesifikasi Sekunder saat Primer Tidak Menghasilkan Apa Pun
Jika tidak ada kecocokan yang dihasilkan oleh spesifikasi penyelesaian yang ditentukan, maka comp-option diambil untuk penyelesaian yang disebutkan dengan opsi -o.
$ complete -F _count_files -o dirnames ./countfiles.sh
Seperti di atas, penyelesaian didefinisikan dengan fungsi _count_files untuk file ./countfiles.sh. Jika fungsi _count_files() tidak menghasilkan kecocokan apa pun, maka penyelesaian direktori akan dicoba.
$ ls countfiles.sh dir1/ dir2/ dir3/ $./countfiles.sh [TAB][TAB] dir1 dir2 dir3