Como criar um script com o preenchimento automático?

94

Quando eu uso programa como svn e eu digito no Terminal do Gnome:

svn upd

e clique em Tab e é autocompleted para:

svn update

É possível fazer algo assim no meu script personalizado?

    
por UAdapter 17.10.2011 / 17:12
fonte

4 respostas

31

Você pode usar a Conclusão programável . Consulte os /etc/bash_completion e /etc/bash_completion.d/* para alguns exemplos.

    
por Florian Diesch 17.10.2011 / 17:54
fonte
154

Estou seis meses atrasado, mas estava procurando a mesma coisa e achei isso:

Você terá que criar um novo arquivo:

/etc/bash_completion.d/foo

Para um autocompletar estático ( --help / --verbose , por exemplo), adicione isto:

_foo() 
{
    local cur prev opts
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    opts="--help --verbose --version"

    if [[ ${cur} == -* ]] ; then
        COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
        return 0
    fi
}
complete -F _foo foo
  • COMP_WORDS é uma matriz contendo todas as palavras individuais na linha de comando atual.
  • COMP_CWORD é um índice da palavra que contém a posição atual do cursor.
  • COMPREPLY é uma variável de matriz a partir da qual o Bash lê as possíveis conclusões.

E o comando compgen retorna a matriz de elementos de --help , --verbose e --version correspondendo à palavra atual "${cur}" :

compgen -W "--help --verbose --version" -- "<userinput>"

Fonte: link

    
por Louis Soulez 13.09.2013 / 17:41
fonte
27

Aqui está um tutorial completo.

Vamos ter um exemplo de script chamado admin.sh para o qual você gostaria de ter o preenchimento automático em funcionamento.

#!/bin/bash

while [ $# -gt 0 ]; do
  arg=
  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

Nota na lista de opções. Chamar script com essa opção imprimirá todas as opções possíveis para este script.

E aqui você tem o script de autocompletar:

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

  local cur
  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 concluir é o nome do script ao qual você deseja adicionar o preenchimento automático. Tudo o que você precisa fazer é adicionar seu script de autocompletar para bashrc como

source /path/to/your/autocomplete.sh

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

    
por kokosing 14.06.2014 / 12:33
fonte
6

Se tudo o que você deseja é um preenchimento automático simples baseado em palavras (portanto, nenhuma conclusão de subcomando ou qualquer coisa), o comando complete tem uma opção -W que faz a coisa certa.

Por exemplo, eu tenho as seguintes linhas no meu .bashrc para autocompletar um programa chamado jupyter :

# gleaned from 'jupyter --help'
_jupyter_options='console qtconsole notebook' # shortened for this answer
complete -W "${_jupyter_options}" 'jupyter'

Agora jupyter <TAB> <TAB> autocompletes para mim.

Os documentos em gnu.org são úteis.

Parece que a variável IFS está sendo configurada corretamente, mas isso não causou problemas para mim.

Para adicionar a conclusão do nome do arquivo e a conclusão BASH padrão, use a opção -o :

complete -W "${_jupyter_options}" -o bashdefault -o default 'jupyter'

Para usar isso em zsh, adicione o seguinte código antes de executar o comando complete no seu ~/.zshrc :

# make zsh emulate bash if necessary
if [[ -n "$ZSH_VERSION" ]]; then
    autoload bashcompinit
    bashcompinit
fi
    
por Ben 28.11.2016 / 01:04
fonte