Como fornecer a conclusão do Bash para um executável local do diretório?

1

Eu escrevi um script Bash para me ajudar a gerenciar alguns links simbólicos. É um wrapper em torno de alguns comandos Stow .

Quando invoco, passo dois argumentos de linha de comando: um comando ( plug / unplug / replug ) e um nome de diretório (apenas seu nome de base, não um caminho).

O script é chamado vlink , portanto, uma invocação seria, por exemplo:

vlink plug foo

O nome do diretório ( foo no exemplo acima) precisa ser um dos subdiretórios de um diretório específico em outro lugar no meu sistema.

Como existem apenas três comandos possíveis ( plug / unplug / replug ) e um conjunto específico de possíveis nomes de diretório para o terceiro argumento, gostaria de fornecer uma conclusão de tabulação para ele. / p>

Estou um pouco familiarizado com a escrita de scripts de conclusão do Bash, mas existe uma maneira de fornecer comandos de conclusão para um executável que não esteja em meu $ PATH e seja destinado apenas a ser executado a partir de seu diretório pai?

    
por ivan 26.03.2018 / 04:43

1 resposta

3

Isso pode funcionar:

_vlink () {
    case $COMP_CWORD in
        1) COMPREPLY=( $(compgen -W "plug unplug replug" "$2") ) ;;
        2) local IFS=$'\n'
            COMPREPLY=( $(cd /some/dir && compgen -d "$2") ) ;;
    esac
}

complete -F _vlink vlink

Substitua /some/dir pelo diretório que contém os subdiretórios de interesse. (Estou supondo que seus nomes de diretório não tenham novas linhas neles.)

  • COMP_CWORD é o índice da palavra que está sendo concluída (0 sendo o nome do comando)
  • o segundo argumento para a função de conclusão é a palavra que está sendo concluída (o primeiro é o nome do comando e o terceiro é a palavra anterior)

Então, usamos compgen :

  • para o primeiro argumento, para gerar palavras correspondentes na lista de palavras fornecidas com -W e
  • para o segundo argumento, para gerar nomes de diretórios correspondentes do diretório relevante.
por 26.03.2018 / 05:31