Como obter configurações de conclusão bash para serem herdadas por shells filho?

3

Eu tenho um arquivo de configuração específico do projeto que eu fonte antes de executar a tela do gnu.

Nesse arquivo, eu configurei a conclusão do bash para o meu comando de teste e os testes relacionados.

Parece-se com isto:

$PROJECT_HOME/app/bin/lib/behat_suites.sh  # _behat_suites() defined here
complete -F _behat_suites run_behat_suite
export -f _behat_suites

O problema é que cada tela é um novo shell, e a configuração complete -F não sobrevive (o restante do ambiente faz - eles são sub-conjuntos apropriados).

O export significa que a função sobrevive nas sub-camadas da tela, mas a configuração de conclusão em si não.

Em falta de uma ferramenta como direnv, ou colocando a configuração em meu usuário ~ / .bashrc, existe uma maneira de obter a configuração de conclusão a ser herdada pelos processos do shell filho?

    
por Greg Bell 24.07.2018 / 00:47

2 respostas

1

Não vejo nenhum método para fazer isso facilmente. Você teria que passar a saída de complete -p do shell pai para os shells filhos.

Para começar, você pode injetar comandos extras no subshell:

$ bash --rcfile <(echo '. ~/.bash_profile')

Agora, se tentarmos introduzir complete -p nisso, assim:

$ bash --rcfile <(echo '. ~/.bash_profile'; while read line; do echo "$line"; done < <(complete -p))
complete: usage: complete [-abcdefgjksuv] [-pr] [-DE] [-o option] [-A action] [-G globpat] [-W wordlist]  [-F function] [-C command] [-X filterpat] [-P prefix] [-S suffix] [name ...]

Quase funciona, parece estar ficando desarmado com a entrada dos comandos complete . Tentar usar um arquivo como intermediário também não funcionou:

$ complete -p > /tmp/cmp.txt; bash --rcfile <(echo '. ~/.bash_profile'; echo '. /tmp/cmp.txt')
complete: usage: complete [-abcdefgjksuv] [-pr] [-DE] [-o option] [-A action] [-G globpat] [-W wordlist]  [-F function] [-C command] [-X filterpat] [-P prefix] [-S suffix] [name ...]

Tentar ver por que está falhando não lança muita luz sobre as coisas. Aqui estou ativando a saída detalhada do bash via -set -x :

$ bash
$ set -x

Em seguida, procuramos o arquivo que fizemos há um segundo atrás:

$ . /tmp/cmp.txt
+ . /tmp/cmp.txt
++ complete -F _manila manila
++ complete -F _minimal
complete: usage: complete [-abcdefgjksuv] [-pr] [-DE] [-o option] [-A action] [-G globpat] [-W wordlist]  [-F function] [-C command] [-X filterpat] [-P prefix] [-S suffix] [name ...]
++ complete -F _command time
++ complete -F _command do
++ complete -o bashdefault -o default -o nospace -F __git_wrap_git_checkout gcob

Então, a menos que haja alguma esperteza, parece que os dados contidos na saída de complete -p não são portáveis neste caso específico.

Referências

por 24.07.2018 / 01:58
1

Você não precisa colocar todas as configurações em seu ~ / .bashrc, mas você pode adicionar um "one-liner" para ver se a função _behat_suites foi definida < em> e a função de conclusão não foi definida ; Em caso afirmativo, defina a conclusão.

Aqui está o one-liner, quebrado um pouco para facilitar a leitura:

declare -f _behat_suites          >/dev/null && 
  ! complete -p run_behat_suite   >/dev/null && 
      complete -F _behat_suites run_behat_suite
    
por 27.07.2018 / 20:34