Como criar script com preenchimento automático?

Como criar script com preenchimento automático?

Quando uso um programa como svne digito no Terminal Gnome:

svn upd

e clique Tabem preenchimento automático para:

svn update

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

Responder1

Você terá que criar um novo arquivo:

/etc/bash_completion.d/foo

Para um preenchimento automático estático ( --help/ --verbosepor 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 array a partir da qual o Bash lê as possíveis conclusões.

E o compgencomando retorna a matriz de elementos de --helpe --verbosecorresponde --versionà palavra atual "${cur}":

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

Fonte

Responder2

Aqui está um tutorial completo.

Vamos dar um exemplo de script chamado admin.shpara o 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_2
    ;;
    shortlist)
      echo option_1 option_2 shortlist
    ;;
    *)
     echo Wrong option
    ;;
  esac
  shift
done

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

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

_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 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

Responder3

Você pode usar oConclusão programável. Dê uma olhada em /etc/bash_completione /etc/bash_completion.d/*para alguns exemplos.

Responder4

Se tudo o que você deseja é um simples preenchimento automático baseado em palavras (sem conclusão de subcomando nem nada), o completecomando tem uma -Wopção que faz a coisa certa.

Por exemplo, tenho as seguintes linhas .bashrcpara preencher automaticamente um programa chamadoJúpiter:

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

Agora jupyter <TAB> <TAB>é preenchido automaticamente para mim.

Odocumentosem gnu.org são úteis.

Parece depender da IFSconfiguração correta da variável, mas isso não causou nenhum problema para mim.

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

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

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

# make zsh emulate bash if necessary
if [[ -n "$ZSH_VERSION" ]]; then
    autoload bashcompinit
    bashcompinit
fi

informação relacionada