Entradas duplicadas em $ PATH um problema?

39

Eu fonte de bashrc de alguns dos meus amigos. Então acabo tendo entradas duplicadas na minha variável $ PATH. Não tenho certeza se esse é o problema para os comandos demorando para começar. Como o $ PATH trabalha internamente no bash? Ter mais ROTAS diminui meu tempo de inicialização?

    
por balki 13.06.2011 / 10:05

4 respostas

38

Ter mais entradas em $PATH não atrasa sua inicialização diretamente, mas diminui a velocidade toda vez que você executa um comando específico em uma sessão de shell (não toda vez que você executa o comando, porque o bash mantém um cache). A lentidão é raramente perceptível, a menos que você tenha um sistema de arquivos particularmente lento (por exemplo, NFS, Samba ou outro sistema de arquivos de rede, ou no Cygwin).

Entradas duplicadas também são um pouco irritantes quando você revisa seu $PATH visualmente, você tem que percorrer mais informações.

É bastante fácil evitar adicionar entradas duplicadas.

case ":$PATH:" in
  *":$new_entry:"*) :;; # already there
  *) PATH="$new_entry:$PATH";; # or PATH="$PATH:$new_entry"
esac

Nota: o uso do script de shell de outra pessoa significa executar o código que ele escreveu. Em outras palavras, você está oferecendo aos seus amigos acesso à sua conta sempre que quiser.

Nota: .bashrc não é o lugar certo para definir $PATH ou qualquer outra variável de ambiente. Variáveis de ambiente devem ser definidas em ~/.profile . Veja Quais arquivos de configuração deve ser usado para configurar variáveis de ambiente com o bash? , Diferença entre .bashrc e .bash_profile .

    
por 13.06.2011 / 10:34
30

Eu já vi pessoas limpando duplicatas de sua variável PATH usando awk e algo assim:

PATH=$(printf "%s" "$PATH" | awk -v RS=':' '!a[$1]++ { if (NR > 1) printf RS; printf $1 }')

Você pode tentar adicioná-lo ao seu próprio bashrc e certificar-se de que você está alocando os outros arquivos em algum lugar antes de executá-lo.

Uma alternativa seria usar o utilitário pathmerge .

Quanto ao problema de velocidade, isso não afetará o tempo de inicialização do shell de maneira significativa, mas pode economizar algum tempo fazendo a conclusão de guias para comandos, especialmente quando o comando não é encontrado no caminho e faz pesquisas repetidas através das mesmas pastas procurando por ele.

Uma nota sobre segurança: Você deve realmente prestar atenção avisos de Gilles sobre segurança aqui. Ao pesquisar um arquivo pertencente a outro usuário, você está dando um passe livre para que esses usuários executem seu próprio código como usuário sempre que você iniciar um shell. Se você não confia em seus usuários com sua senha, você não deve fornecer seus arquivos shell.

    
por 13.06.2011 / 10:32
5

Com base na resposta @Gilles, você pode envolvê-lo em uma função para minimizar a digitação:

function addToPATH {
  case ":$PATH:" in
    *":$1:"*) :;; # already there
    *) PATH="$1:$PATH";; # or PATH="$PATH:$1"
  esac
}

addToPATH /Applications/AIRSDK_Compiler/bin
addToPATH ~/.local/lib/npm/bin
    
por 11.05.2016 / 09:25
4

Apenas a primeira correspondência em $PATH é executada, portanto, todas as entradas subseqüentes não são processadas depois disso. É por isso que às vezes você deve revisar a ordem das entradas em $PATH para fazer com que seu ambiente se comporte conforme o esperado.

Para responder à sua pergunta: isso não deve ser a causa da inicialização lenta.

    
por 13.06.2011 / 10:33

Tags