Executando zsh rehash after build

2

Eu tenho um script de construção que pode mudar o que os binários estão em meu $ PATH (ele não edita o $ PATH em si, mas adiciona / exclui arquivos para pastas que já estão no $ PATH). O preenchimento automático do zsh não é atualizado para refletir os arquivos que foram adicionados / excluídos em resposta à compilação, portanto, eu preciso reiniciar o shell ou executar o shell 'rehash' integrado para que ele atualize seu cache de preenchimento automático. / p>

Eu decidi que queria automatizar a execução do rehash. De início, fiz isso:

build() {
    ~/bin/real_build && rehash
}

Mas as funções do shell são executadas em seu próprio subshell, então o rehash atualizaria o cache para o subshell, em vez do shell no terminal que eu estava usando. Então eu mudei para isso:

alias build='~/bin/real_build && rehash'

O que funciona, exceto quando eu quero passar argumentos para construir. Se eu passar "limpo" eu gostaria que fosse executado:

~/bin/real_build clean && rehash

Mas, em vez disso, será:

~/bin/real_build && rehash clean

Então, eu estou preso - eu posso usar um alias e não ser capaz de passar argumentos, ou posso usar uma função e não atualizar as entradas de autocompletar. Existe uma maneira de fazer os dois trabalhos?

    
por Joseph Garvin 17.08.2012 / 17:44

2 respostas

1

As funções do shell não são executadas em seu próprio subshell, a menos que você use parênteses em vez das chaves normais ao redor do corpo. Sua função atualiza o hash executável em todas as versões do zsh que eu vi, e eu não acho que haja uma opção para mudar esse comportamento.

    
por 18.08.2012 / 01:37
0

Acho que source pode ser a melhor opção aqui. Aqui está um exemplo:

cat << EOF > foo
touch $1
chmod +x $1
rehash
EOF

Execute foo da seguinte forma:

source foo bar

Se isso estivesse em seu caminho, bar agora é completável.

    
por 17.08.2012 / 17:57