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?
bash
autocomplete
Kshitiz Sharma
sumber
sumber
/etc/bash_completion.d
. Lihat juga/etc/bash_completion
dan lihat output dariset
, seberapa banyak lingkungan Anda tumbuh.gdbus-bash-completion.sh
gvfs-bash-completion.sh
pk-completion.bash
yum.bash
. Outputnyaset
juga tidak menarik./etc/profile.d
. Atau mungkin Anda.bash_profile
atau.bashrc
sudah dimodifikasi.bash-completion
memuat penyelesaian secara dinamis sejak itu1.90
. Cobalah:sqlldr<space><tab><enter>
. Kemudian ketikcomplete -p sqlldr
.Jawaban:
Penyelesaian yang dapat diprogram Bash bekerja dengan menguraikan baris perintah dan mencari tahu apa yang sedang diselesaikan:
$
diselesaikan sebagai nama variabel, dll.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.
sqllTab
sqll
sqlldr $aTab
a
sqlldr Tab
sqlldr
Aturan penyelesaian didefinisikan oleh
complete
builtin. Bash tidak melacak kapancomplete
builtin 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 panggilancomplete
, dengan skrip yang harus dibaca dari.bashrc
(atau/etc/bash.bashrc
jika diterapkan) untuk memuat semua skrip ini: biasanya. /etc/bash_completion
diperlukan 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.d
atau mungkin telah datang dengan instruksi untuk memasukkan beberapa kode dalam file Anda.bashrc
. Anda dapat menggunakancomplete -p sqlldr
untuk melihat aturan saat ini untuksqlldr
; 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.
sumber
complete
dipanggil. 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 dinamiscomplete -p
).and the settings for the basename of the command are applied
. Tidak. Anda dapat memiliki compspec yang berbeda untukdate
dan/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