Bagaimana cara kerja penyelesaian otomatis Bash?

9

Saya dapat memahami bahwa penyelesaian otomatis bash berfungsi untuk utilitas standar. Tapi bagaimana cara menyelesaikan otomatis untuk program kustom seperti Oracle SQL loader?

Dalam perintah berikut ini jika Anda Tab setelah control=itu otomatis melengkapi ke nama file kontrol:

sqlldr kshitiz/oracle@XE control=data.ctl data=data.csv bad=data.bad log=data.log

Bagaimana ia tahu harus mengisi file kontrol pada saat itu dan bukan file lain?

Kshitiz Sharma
sumber
2
Penyempurnaan parameter dilakukan dengan fungsi. Kebanyakan dari mereka sudah diatur /etc/bash_completion.d. Lihat juga /etc/bash_completiondan lihat output dari set, seberapa banyak lingkungan Anda tumbuh.
ott--
@ott Apa yang harus saya cari di lokasi itu? Saya tidak dapat melihat apa pun yang terkait dengan sqlldr. Semua yang saya miliki adalah: gdbus-bash-completion.sh gvfs-bash-completion.sh pk-completion.bash yum.bash. Outputnya setjuga tidak menarik.
Kshitiz Sharma
Bisa juga dilakukan di beberapa skrip dari /etc/profile.d. Atau mungkin Anda .bash_profileatau .bashrcsudah dimodifikasi.
ott--
Bagaimana fungsi-fungsi ini berbeda dari fungsi normal. Dan bagaimana saya bisa mendefinisikan sendiri untuk menyediakan pelengkapan otomatis untuk skrip khusus? Bisakah Anda menunjuk ke arah yang benar?
Kshitiz Sharma
1
@KshitizSharma, bash-completionmemuat penyelesaian secara dinamis sejak itu 1.90. Cobalah: sqlldr<space><tab><enter>. Kemudian ketik complete -p sqlldr.
Evgeny Vereshchagin

Jawaban:

6

Penyelesaian yang dapat diprogram Bash bekerja dengan menguraikan baris perintah dan mencari tahu apa yang sedang diselesaikan:

  1. Beberapa konteks diperlakukan secara khusus, misalnya kata pertama dalam suatu perintah diselesaikan sebagai nama perintah, yang mengikuti a $diselesaikan sebagai nama variabel, dll.
  2. Di luar konteks ini, bash mencoba untuk menyelesaikan argumen dari suatu perintah, dan pengaturan untuk perintah atau kegagalan itu (yang biasanya merupakan kasus) untuk nama merek dari perintah tersebut diterapkan.

Misalnya, setelah , bash melengkapi nama perintah yang dimulai dengan . Setelah , bash melengkapi nama variabel yang dimulai dengan . Setelah , bash menerapkan aturan penyelesaian untuk perintah . Aturan penyempurnaan dapat menentukan kategori (pengguna, variabel, file, dll.), Pola karakter pengganti untuk nama file, atau fungsi atau potongan kode untuk dieksekusi.sqllTabsqllsqlldr $aTabasqlldr Tabsqlldr

Aturan penyelesaian didefinisikan oleh completebuiltin. Bash tidak melacak kapan completebuiltin dipanggil atau skrip apa (jika ada). Sebagian besar distribusi mengirimkan paket bash-completion , yang menyediakan serangkaian aturan untuk perintah umum. Ini mengambil bentuk serangkaian file skrip yang berisi panggilan complete, dengan skrip yang harus dibaca dari .bashrc(atau /etc/bash.bashrcjika diterapkan) untuk memuat semua skrip ini: biasanya . /etc/bash_completiondiperlukan untuk mengaktifkan penyelesaian yang dapat diprogram dan memuat skrip yang tersedia.

Paket standar tidak termasuk dukungan untuk sqlldr. Jika Anda memiliki dukungan seperti itu, itu harus berasal dari sumber yang berbeda. Sumber ini mungkin telah menjatuhkan file dalam direktori seperti /etc/bash_completion.datau mungkin telah datang dengan instruksi untuk memasukkan beberapa kode dalam file Anda .bashrc. Anda dapat menggunakan complete -p sqlldruntuk melihat aturan saat ini untuk sqlldr; seperti yang disebutkan sebelumnya, ini tidak akan memberi tahu Anda dari mana aturan itu diambil.

Tcsh, zsh dan ikan memiliki mekanisme yang agak mirip (semua orang mendapat inspirasi dari tcsh) tetapi builtin, sintaksis dan kemampuan yang berbeda.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
ya, Anda tidak dapat menemukan di mana completedipanggil. Tetapi Anda dapat menemukan nama file sumber dan nomor baris di mana fungsi penyelesaian didefinisikan. complete -p sudo # outputs complete -F _sudo sudo, shopt -s extdebug, declare -F _sudo # outputs _sudo 3 /usr/share/bash-completion/completions/sudo. (Tapi lihat komentar saya tentang pemuatan dan penyelesaian secara dinamis complete -p).
Evgeny Vereshchagin
and the settings for the basename of the command are applied. Tidak. Anda dapat memiliki compspec yang berbeda untuk datedan /bin/date. Referensi mengatakan : Jika kata perintah adalah nama path lengkap, compspec untuk nama path lengkap dicari terlebih dahulu. Jika tidak ada compspec yang ditemukan untuk pathname lengkap, upaya dilakukan untuk menemukan compspec untuk bagian setelah slash terakhir
Evgeny Vereshchagin