Local padrão para scripts bash_completion.d definidos pelo usuário?

47

Eu tenho acesso de usuário (sem raiz) a uma máquina Linux (Suse) onde desenvolvi alguns scripts bash e as regras correspondentes de preenchimento automático do bash.

Como os scripts pertencem apenas ao meu usuário e, portanto, eu preciso das regras completas "ativas" somente para mim (parte do fato de eu não ter acesso à gravação raiz), colocar o script bash_completion na /etc/bash_completion.d/pasta não é uma opção.

No momento, eu nomeei meu arquivo .bash_completion.myscripte o originei diretamente do meu .bashrc, mas eu me pergunto se existe alguma outra maneira "padrão" de obter esses resultados, já considerados na implementação do bash.

Por exemplo, criando uma pasta /home/myuser/.bash_completion.d/?

Carles Sala
fonte

Respostas:

36

Use um ~/.bash_completionarquivo

Nas Perguntas frequentes sobre a conclusão do Bash :

P. como posso inserir minhas próprias conclusões locais sem precisar
reinseri-las toda vez que você lança um novo release?

A. Coloque-os em ~ / .bash_completion, que é analisado no final do
script de conclusão principal. Veja também a próxima pergunta.

Q. Eu autor / mantenho o pacote X e gostaria de manter meu próprio
código de conclusão para este pacote. Onde devo colocá-lo para ter certeza de
que os shells bash interativos o encontrarão e o originarão?

A. Instale-o em um dos diretórios apontados pelas
variáveis ​​de arquivo pkgconfig do bash-conclusão. Existem duas
alternativas: a recomendada é 'completionsdir' (obtenha-a com
"pkg-config --variable = completionsdir bash-conclusão") a partir da qual as
conclusões são carregadas sob demanda com base nos nomes dos comandos invocados
. arquivo de conclusão adequadamente e incluir,
por exemplo, links simbólicos, caso o arquivo forneça conclusões
para mais de um comando. O outro presente por
motivos de compatibilidade com versões anteriores é 'compatdir' (obtenha-o com
"pkg-config --variable = compatdir bash-complete"

Dennis Williamson
fonte
Pesquisei e pesquisei bastante no serverfault antes de perguntar, mas não pensei na etapa mais básica: RTFM! Muito obrigado pela resposta!
Carles Sala
4
Pode querer especificar que .bash_completioné um arquivo e não um diretório. Como bash_completion.dé um diretório, eu assumi que poderia apenas scpmeu local bash_completion.de renomeá-lo no servidor remoto, mas no próximo login, ele me disse que tinha que ser um arquivo.
NobleUplift 2/11
3
As perguntas frequentes sobre a conclusão do bash do @NobleUplift foram alteradas e agora contêm informações sobre uma maneira de carregar as conclusões do bash do usuário em um diretório sob demanda. Isso parece funcionar pela versão 2.8 do bash-complete pelo menos, mas não pela 2.1. Os arquivos no diretório devem ser nomeados exatamente como o comando a que se destinam, ou links simbólicos podem ser usados ​​para esse fim.
jarno 20/01
@jarno Eu codifiquei scripts de conclusão do bash para todos os programas e scripts personalizados em nosso sistema, mas meus desenvolvedores seniores os derrubaram :(
NobleUplift
@NobleUplift por quê? Você pode usá-los para você mesmo assim.
jarno 26/01
49

Aqui está como um usuário local pode ter um ~/.bash_completion.d/diretório ativo.

  1. editar arquivo:, nano ~/.bash_completionadicione o seguinte:

    for bcfile in ~/.bash_completion.d/* ; do
      . $bcfile
    done
    
  2. faça o diretório: mkdir ~/.bash_completion.d

  3. editar arquivo:, ~/.bash_completion.d/myscriptadicione o seguinte:

    _myscript_tab_complete () {
        local cur prev opts
        COMPREPLY=()
        cur="${COMP_WORDS[COMP_CWORD]}"
        prev="${COMP_WORDS[COMP_CWORD-1]}"
        words="-f -h --etc"
    
        COMPREPLY=( $(compgen -W "${words}" -- ${cur}) )
        return 0
    }
    complete -F _myscript_tab_complete myscript
    
  4. source .bash_completion: . ~/.bash_completion

Atualizar

Se você espera ter um ~/.bash_completion.d/diretório vazio e deseja evitar a mensagem de erro bash: /home/<username>/.bash_completion.d/*: No such file or directory, adicione um teste de tipo de arquivo com [ -f "$bcfile" ].

for bcfile in ~/.bash_completion.d/* ; do
  [ -f "$bcfile" ] && . $bcfile
done
Russell E Glaue
fonte
2

A resposta de Russell E Glaue é ótima, mas ~/.bash_completionestá incompleta.

O problema é quando ~/.bash_completion.d/está vazio e, subsequentemente, for f in ~/.bash_completion.d/*imprime a seguinte mensagem de erro:

-bash: /home/user/.bash_completion.d/*: esse arquivo ou diretório não existe

A solução mais simples e portátil é pular o loop se o diretório estiver vazio:

if [[ -d ~/.bash_completion.d/ ]] && \
   ! find ~/.bash_completion.d/. ! -name . -prune -exec false {} +
then
    for f in ~/.bash_completion.d/*
    do
        source "$f"
    done
fi
Mateusz Piotrowski
fonte
1

Uma solução mais simples é usar a opção nullglob. Embora isso não seja portátil, nem as conclusões do bash. Portanto, a portabilidade não importa.

Além disso, convém usar aspas ao redor da variável ao fazer o sourcing. Isso lida com o caso em que o arquivo possui espaços com outros caracteres especiais.

shopt -s nullglob

for f in ~/.bash_completion.d/*; do
  [ -f "$f" ] && . "$f"
done
npmccallum
fonte
11
Para sua informação, uma explicação (ou link para a documentação) sobre algo que está sendo mostrado (isto nullglobé) é útil para o leitor.
Cometsong 25/02
1

Pelo menos bash-conclusão 2.8 e posterior habilitar opção para colocar conclusões locais Bash no diretório

${BASH_COMPLETION_USER_DIR:-${XDG_DATA_HOME:-$HOME/.local/share}/bash-completion}/completions

Os nomes dos arquivos de conclusão ou os nomes simbólicos dos links devem corresponder aos respectivos nomes de comando. Essas conclusões são carregadas somente sob demanda. As conclusões armazenadas no arquivo ~/.bash_completion são sempre carregadas.

Referência: Consulte "Q. Onde devo instalar minhas próprias conclusões locais?" em https://github.com/scop/bash-completion/blob/master/README.md

jarno
fonte