Quando uso um programa como svn
e 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
/ --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 array a partir da qual o Bash lê as possíveis conclusões.
E o compgen
comando retorna a matriz de elementos de --help
e --verbose
corresponde --version
à palavra atual "${cur}"
:
compgen -W "--help --verbose --version" -- "<userinput>"
Responder2
Aqui está um tutorial completo.
Vamos dar um exemplo de script chamado admin.sh
para 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_completion
e /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 complete
comando tem uma -W
opção que faz a coisa certa.
Por exemplo, tenho as seguintes linhas .bashrc
para 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 IFS
configuraçã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 -o
opção:
complete -W "${_jupyter_options}" -o bashdefault -o default 'jupyter'
Para usar isso no zsh, adicione o seguinte código antes de executar o complete
comando em seu ~/.zshrc
:
# make zsh emulate bash if necessary
if [[ -n "$ZSH_VERSION" ]]; then
autoload bashcompinit
bashcompinit
fi