Eu usei complete -W 'firstdatabase databasetwo etc' mysql para salvar uma lista de bancos de dados, para que eu possa preenchê-los automaticamente usando o comando mysql .
No entanto, em muitos casos, eu digitaria mysql db < /tmp/script.sql . Como posso obter o bash para reverter para o autocomplete tradicional (nomes de arquivo) depois de ver o primeiro > ou < ?
Atualização: Eu puxei uma instalação do Ubuntu, que vem com o bash-autocomplete pré-instalado. Embora a simples instalação do mesmo pacote em nosso servidor não seja uma opção para mim, ainda posso aprender com sua implementação examinando a saída de complete -p e declare . ( alias -p tem algumas coisas legais também)
No nosso servidor, usei complete -d cd . Observo que ela sofre o mesmo problema, pois depois de < ou > , a funcionalidade complete -d persiste. No entanto, bash-autocomplete tem uma abordagem mais elaborada que resolve esse problema. Aprender como eles resolveram isso por cd (e uma infinidade de outros comandos) pode mostrar como resolver o mesmo problema que estou tendo para mysql .
Portanto, aqui está sua implementação para cd : eles usam complete -o nospace -F _cd cd , que basicamente chama a função _cd para a consulta de preenchimento automático. Aqui está a função que eles usam:
_cd ()
{
local cur prev words cword;
_init_completion || return;
local IFS='
' i j k;
compopt -o filenames;
if [[ -z "${CDPATH:-}" || "$cur" == ?(.)?(.)/* ]]; then
_filedir -d;
return 0;
fi;
local -r mark_dirs=$(_rl_enabled mark-directories && echo y);
local -r mark_symdirs=$(_rl_enabled mark-symlinked-directories && echo y);
for i in ${CDPATH//:/'
'};
do
k="${#COMPREPLY[@]}";
for j in $( compgen -d $i/$cur );
do
if [[ ( -n $mark_symdirs && -h $j || -n $mark_dirs && ! -h $j ) && ! -d ${j#$i/} ]]; then
j+="/";
fi;
COMPREPLY[k++]=${j#$i/};
done;
done;
_filedir -d;
if [[ ${#COMPREPLY[@]} -eq 1 ]]; then
i=${COMPREPLY[0]};
if [[ "$i" == "$cur" && $i != "*/" ]]; then
COMPREPLY[0]="${i}/";
fi;
fi;
return 0
}
complete -o nospace -F _cd cd
A execução do código acima em uma versão recente de bash fornece os resultados desejados para cd . Agora, como isso pode ser convertido para mysql ? (ou qualquer coisa que eu normalmente usaria complete -W ?)