Como especificar um preenchimento automático personalizado para comandos específicos?

25

Existe uma maneira de o bash saber exatamente o que exibir ao dobrar a guia? Por exemplo, eu tenho um script python scpyque requer alguns argumentos. Por exemplo apt-get, se você clicar duas vezes na guia,

autoclean build-dep clean dselect-upgrade atualização da fonte de eliminação
autoremove verificar dist-upgrade instalar remover atualização  

Existe uma maneira de fazer isso para seus próprios scripts / programas? Preciso agrupar meu script python em um script bash?

Falmarri
fonte

Respostas:

31

A maneira mais fácil de fazer isso é incluir um shell script /etc/bash_completion.d/. A estrutura básica desse arquivo é uma função simples que executa a conclusão e a invocação do completequal é um bash interno. Em vez de entrar em detalhes sobre como usar complete, sugiro que você leia Uma introdução à conclusão do bash . A Parte 1 aborda o básico e a Parte 2 explica como você escreveria um script de conclusão.

Uma descrição mais densa da conclusão do bash pode ser encontrada na seção "Conclusão programável" de man bash(você pode digitar "/ Conclusão programável" e pressionar 'n' algumas vezes para chegar lá rapidamente. Ou, se estiver com sorte, "g RETORNO 2140 ").

Steven D
fonte
8

Aqui está o guia básico.

Vamos ter um exemplo de script chamado admin.sh, no qual você gostaria que o preenchimento automático funcionasse.

#!/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

Observe a lista de opções. Chamar script com esta opção imprimirá todas as opções possíveis para esse script.

E aqui você tem o script de preenchimento automático:

_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

Observe que o último argumento a ser concluído é o nome do script ao qual você deseja adicionar o preenchimento automático. Tudo que você precisa fazer é adicionar seu script de preenchimento automático ao bashrc como

source /path/to/your/autocomplete.sh

ou copie-o para /etc/bash.completion.d

Fonte: /ubuntu//a/483149/24155

Eduardo Cuomo
fonte
3
'tutorial completo' não é a frase que eu usaria para descrever isso ...
searchengine27