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.