Bagaimana cara menentukan pelengkapan otomatis khusus untuk perintah tertentu?

25

Apakah ada cara agar bash tahu persis apa yang harus ditampilkan ketika Anda menggandakan tab? Misalnya saya punya skrip python scpyyang membutuhkan beberapa argumen. Misalnya suka apt-get, jika Anda menggandakan tab memberi Anda

autoclean build-dep clean dselect-upgrade pemutakhiran sumber pembersihan
autoremove check dist-upgrade instal hapus pembaruan  

Apakah ada cara untuk melakukannya untuk skrip / program Anda sendiri? Apakah saya perlu membungkus skrip python saya dalam skrip bash?

Falmarri
sumber

Jawaban:

31

Cara termudah untuk melakukan ini adalah dengan memasukkan skrip shell ke dalam /etc/bash_completion.d/. Struktur dasar dari file ini adalah fungsi sederhana yang melakukan penyelesaian dan kemudian doa completeyang merupakan bash builtin. Daripada merinci cara menggunakan complete, saya sarankan Anda membaca An Pengantar Penyelesaian Bash . Bagian 1 membahas dasar-dasar dan Bagian 2 membahas bagaimana Anda akan menulis skrip penyelesaian.

Deskripsi yang lebih lengkap tentang penyelesaian bash dapat ditemukan di bagian "Penyelesaian Programmable" dari man bash(Anda dapat mengetik "/ Penyelesaian Programmable" dan kemudian tekan 'n' beberapa kali untuk sampai ke sana dengan cepat. Atau, jika Anda merasa beruntung, "g 2140 KEMBALI ").

Steven D
sumber
8

Berikut ini panduan dasar.

Mari kita memiliki contoh skrip bernama admin.sh yang ingin Anda lengkapi autocomplete.

#!/bin/bash

while [ $# -gt 0 ]; do
  arg=$1
  case $arg in
    option_1)
     # do_option_1
    ;;
    option_2)
     # do_option_1
    ;;
    shortlist)
      echo option_1 option_2 shortlist
    ;;
    *)
     echo Wrong option
    ;;
  esac
  shift
done

Catatan pilihan opsi. Skrip panggilan dengan opsi ini akan mencetak semua opsi yang memungkinkan untuk skrip ini.

Dan di sini Anda memiliki skrip autocomplete:

_script()
{
  _script_commands=$(/path/to/your/script.sh shortlist)

  local cur prev
  COMPREPLY=()
  cur="${COMP_WORDS[COMP_CWORD]}"
  COMPREPLY=( $(compgen -W "${_script_commands}" -- ${cur}) )

  return 0
}
complete -o nospace -F _script ./admin.sh

Perhatikan bahwa argumen terakhir yang harus diselesaikan adalah nama skrip yang ingin Anda tambahkan pelengkapan otomatis. Yang perlu Anda lakukan adalah menambahkan skrip autocomplete ke bashrc as

source /path/to/your/autocomplete.sh

atau salin ke /etc/bash.completion.d

Sumber: /ubuntu//a/483149/24155

Eduardo Cuomo
sumber
3
'tutorial lengkap' bukan frasa yang akan saya gunakan untuk menggambarkan ini ...
searchengine27