Por que um script baseado em PATH é escolhido antes de uma função bash?

0

Estou tentando alterar o comportamento de conda para primeiro atualizar a $PATH para a instalação miniconda e, em seguida, executar o comando. Isso ocorre porque a maior parte do meu trabalho com python não é usando a versão conda e quero preservar o PYTHONPATH . Então aqui está a função bash:

$type conda
conda is a function
conda ()
{
    CONDA=~/miniconda2;
    export PATH=$CONDA/bin:$PATH;
    $CONDA/bin/conda $@
}

Esta função está sendo usada?

$which conda
/usr/local/bin/conda

Não, não é. Então, por que conda pega o executável baseado em antigo $PATH em vez da função bash?

Estou em macos sierra .

    
por javadba 24.11.2017 / 21:52

2 respostas

1

Vários pontos: -

  • PATH não será atualizado até que a função conda seja realmente chamada.
  • PATH será atualizado em todas as conda chamadas, aumentando a PATH .
  • Sua chamada para o binário conda contém referências de diretório e, portanto, não usa PATH , então por que tentar atualizá-lo?

Se você fizer precisar atualizar PATH , verifique se é necessário, dando algo como:

CONDA=~/miniconda2
[ ${PATH#*$CONDA/bin} == $PATH ] && export PATH=$CONDA/bin:$PATH
conda () { $CONDA/bin/conda $@; }

Em outras palavras, execute os comandos de configuração do ambiente antes da declaração conda() , em vez de dentro dela.

    
por 24.11.2017 / 22:36
2

A resposta da AFH está correta, mas não responde à pergunta direta. A resposta direta é: um script baseado em PATH não é escolhido antes de uma função bash. O comando which não informa o que o shell irá executar, ele apenas pesquisa o PATH . type (que é um bash interno) é o que diz o que realmente acontecerá quando você digitar esse comando. Aqui está uma demonstração rápida:

$ type democmd
democmd is a function
democmd () 
{ 
    echo "This is the democmd *function*."
}
$ which democmd
/usr/local/bin/democmd
$ more /usr/local/bin/democmd
#!/bin/bash
echo "This is the democmd *script*, running from /usr/local/bin"
$ democmd
This is the democmd *function*.
$ command democmd    # The "command" command ignores aliases and functions
This is the democmd *script*, running from /usr/local/bin
    
por 25.11.2017 / 08:14

Tags