Eu estou querendo saber onde um novo caminho deve ser adicionado à PATH
variável de ambiente. Eu sei que isso pode ser conseguido editando .bashrc
(por exemplo), mas não está claro como fazer isso.
Deste jeito:
export PATH=~/opt/bin:$PATH
ou isto?
export PATH=$PATH:~/opt/bin
bash
environment-variables
path
bashrc
Paolo
fonte
fonte
PATH=$PATH:$HOME/.local/bin:$HOME/bin
, outro pode ser adicionado, separando com um: por exemploPATH=$PATH:$HOME/.local/bin:$HOME/bin:/home/ec2-user/pear/bin
.Respostas:
As coisas simples
ou
dependendo se você deseja adicionar
~/opt/bin
no final (a ser pesquisado após todos os outros diretórios, caso haja um programa com o mesmo nome em vários diretórios) ou no início (a ser pesquisado antes de todos os outros diretórios).Você pode adicionar várias entradas ao mesmo tempo.
PATH=$PATH:~/opt/bin:~/opt/node/bin
ou variações na encomenda funcionam perfeitamente. Não coloqueexport
no início da linha, pois ela possui complicações adicionais (veja abaixo em "Notas sobre conchas que não sejam do bash").Se você
PATH
for criado por muitos componentes diferentes, poderá acabar com entradas duplicadas. Consulte Como adicionar o caminho do diretório inicial a ser descoberto pelo Unix, que comando? e Remova entradas duplicadas $ PATH com o comando awk para evitar adicionar duplicatas ou removê-las.Algumas distribuições automaticamente colocam
~/bin
no seu PATH, se existir, a propósito.Onde colocá-lo
Coloque a linha de modificar
PATH
em~/.profile
, ou~/.bash_profile
se é o que você tem.Observe que
~/.bash_rc
não é lido por nenhum programa e~/.bashrc
é o arquivo de configuração de instâncias interativas do bash. Você não deve definir variáveis de ambiente em~/.bashrc
. O lugar certo para definir variáveis de ambiente comoPATH
is~/.profile
(ou~/.bash_profile
se você não se importa com shells que não sejam o bash). Consulte Qual é a diferença entre eles e qual devo usar?Não o coloque
/etc/environment
ou~/.pam_environment
: estes não são arquivos shell, você não pode usar substituições como as que estão$PATH
lá. Nesses arquivos, você pode substituir apenas uma variável, não adicionar a ela.Possíveis complicações em alguns scripts do sistema
Você não precisa
export
se a variável já estiver no ambiente: qualquer alteração no valor da variável é refletida no ambiente.¹PATH
é praticamente sempre no ambiente; todos os sistemas unix definem isso muito cedo (geralmente no primeiro processo, de fato).No momento do login, você pode confiar em
PATH
já estar no ambiente e já conter alguns diretórios do sistema. Se você estiver escrevendo um script que pode ser executado mais cedo enquanto a criação de algum tipo de ambiente virtual, pode ser necessário para garantir quePATH
não é vazio e exportados: sePATH
ainda não está definido, então algo comoPATH=$PATH:/some/directory
iria definirPATH
a:/some/directory
, e o componente vazia no começo significa o diretório atual (como.:/some/directory
).Notas sobre conchas que não sejam o bash
No bash, ksh e zsh,
export
há uma sintaxe especial, e ambosPATH=~/opt/bin:$PATH
eexport PATH=~/opt/bin:$PATH
fazem a coisa certa mesmo. Em outros shells no estilo Bourne / POSIX, como o dash (que está/bin/sh
em muitos sistemas),export
é analisado como um comando comum, o que implica duas diferenças:~
é analisado apenas no início de uma palavra, exceto nas atribuições (consulte Como adicionar o caminho do diretório inicial a ser descoberto pelo Unix, que comando? para detalhes);$PATH
aspas duplas externas é interrompido sePATH
contiver espaço em branco ou\[*?
.Assim, em shells como dash,
defineexport PATH=~/opt/bin:$PATH
PATH
a string literal~/opt/bin/:
seguida pelo valor dePATH
até o primeiro espaço.PATH=~/opt/bin:$PATH
(uma tarefa simples) não requer aspas e faz a coisa certa. Se você deseja usarexport
em um script portátil, precisa escreverexport PATH="$HOME/opt/bin:$PATH"
, ouPATH=~/opt/bin:$PATH; export PATH
(ouPATH=$HOME/opt/bin:$PATH; export PATH
para portabilidade, até o shell Bourne que não aceitouexport var=value
e não fez expansão de til).¹ Isso não era verdade nos reservatórios Bourne (como no reservatório Bourne real, não nos reservatórios modernos do estilo POSIX), mas é altamente improvável que você encontre esses reservatórios antigos hoje em dia.
fonte
export
..bashrc
. Presumo que o FZF também esteja escrito em Rust e esteja seguindo o padrão de Rust.De qualquer maneira, funciona, mas eles não fazem a mesma coisa: os elementos de
PATH
são verificados da esquerda para a direita. No seu primeiro exemplo, os executáveis em~/opt/bin
terão precedência sobre os instalados, por exemplo, em/usr/bin
, que pode ou não ser o que você deseja.Em particular, do ponto de vista da segurança, é perigoso adicionar caminhos à frente, porque se alguém puder obter acesso de gravação ao seu
~/opt/bin
, poderá colocar, por exemplo, um diferentels
lá dentro, que você provavelmente usaria em vez disso de/bin/ls
sem perceber. Agora imagine o mesmo para ossh
seu navegador ou escolha ... (O mesmo vale três vezes para colocar. No seu caminho.)fonte
ls
, precisará colocá-la em um diretório antes/bin
.Estou confuso com a pergunta 2 (desde que removida da pergunta por se tratar de um problema não relacionado):
Se você diz
isso é tudo o que estará no seu caminho. PATH é apenas uma variável de ambiente e, se você deseja adicionar ao PATH, precisa reconstruir a variável exatamente com o conteúdo que deseja. Ou seja, o que você dá como exemplo para a pergunta 2 é exatamente o que você quer fazer, a menos que eu esteja totalmente esquecido do ponto da questão.
Eu uso os dois formulários no meu código. Eu tenho um perfil genérico que eu instalo em todas as máquinas em que trabalho que se parece com isso, para acomodar os diretórios que potencialmente estão ausentes:
fonte
A maneira à prova de balas de Anexar / Anexar
Há muitas considerações envolvidas na escolha de anexar versus anexar. Muitos deles são abordados em outras respostas, portanto não os repetirei aqui.
Um ponto importante é que, mesmo que os scripts do sistema não usem isso (pergunto-me por que) * 1 , a maneira à prova de balas para adicionar um caminho (por exemplo,
$HOME/bin
) à variável de ambiente PATH épara anexar (em vez de
PATH="$PATH:$HOME/bin"
) epara anexar (em vez de
PATH="$HOME/bin:$PATH"
)Isso evita o cólon espúrio inicial / final quando
$PATH
está vazio, o que pode ter efeitos colaterais indesejados e pode se tornar um pesadelo , difícil de encontrar ( esta resposta trata brevemente do casoawk
).Explicação (da expansão de parâmetros do shell ):
Assim,
${PATH:+${PATH}:}
é expandido para: 1) nada, sePATH
for nulo ou não definido , 2)${PATH}:
, sePATH
estiver definido.Nota : Isto é para bash.
* 1 Acabei de descobrir que scripts como
devtoolset-6/enable
realmente usam isso,fonte
O Linux determina o caminho da pesquisa executável com a
$PATH
variável de ambiente. Para adicionar diretório / data / myscripts ao início da$PATH
variável de ambiente, use o seguinte:Para adicionar esse diretório ao final do caminho, use o seguinte comando:
Mas o anterior não é suficiente porque, quando você define uma variável de ambiente dentro de um script, essa alteração é efetiva apenas dentro do script. Existem apenas duas maneiras de contornar essa limitação:
Exemplos:
A inclusão basicamente incorpora o script "chamado" no script "chamado". É como um #include em C. Portanto, é eficaz dentro do script ou programa "chamado". Mas é claro que não é eficaz em nenhum programa ou script chamado pelo programa de chamada. Para torná-lo eficaz em toda a cadeia de chamadas, você deve seguir a configuração da variável de ambiente com um comando de exportação.
Como exemplo, o programa bash shell incorpora o conteúdo do arquivo .bash_profile por inclusão. Coloque as 2 linhas a seguir em .bash_profile:
efetivamente coloca essas duas linhas de código no programa bash. Portanto, no bash, a variável $ PATH inclui
$HOME/myscript.sh
e, devido à instrução de exportação, todos os programas chamados pelo bash têm a$PATH
variável alterada . E como todos os programas executados a partir de um prompt do bash são chamados pelo bash, o novo caminho está em vigor para qualquer coisa que você execute a partir do prompt do bash.A linha inferior é que, para adicionar um novo diretório ao caminho, você deve anexar ou anexar o diretório à variável de ambiente $ PATH em um script incluído no shell e exportar a
$PATH
variável de ambiente.Mais informações aqui
fonte
Há algum tempo, eu mantive comigo duas funções
pathadd
epathrm
que ajudam a adicionar elementos ao caminho sem a necessidade de se preocupar com duplicações.pathadd
usa um argumento de caminho único e umafter
argumento opcional que, se fornecido, será anexado aoPATH
caso contrário, ele será anexado .Em quase todas as situações, se você estiver adicionando ao caminho, provavelmente desejará substituir qualquer coisa que já esteja no caminho, e é por isso que opto por prefixar por padrão.
Coloque-os em qualquer script que você deseja alterar o ambiente PATH e agora você pode fazer.
Você está garantido para não adicionar ao caminho se ele já estiver lá. Se você agora deseja garantir
/baz/bat
está no início.Agora qualquer caminho pode ser movido para a frente, se já estiver no caminho sem dobrar.
fonte
Não posso falar por outras distribuições, mas o Ubuntu possui um arquivo / etc / environment, que é o caminho de pesquisa padrão para todos os usuários. Como meu computador é usado apenas por mim, coloquei todos os diretórios desejados no caminho, a menos que seja uma adição temporária que coloquei em um script.
fonte
Existem algumas situações em que o uso
PATH=/a/b:$PATH
pode ser considerado a maneira "incorreta" de adicionar um caminho paraPATH
:PATH
no mesmo formulário.PATH
em uma forma diferente (por exemplo, um alias devido ao uso de links simbólicos ou..
).PATH
quando se pretende substituir outras entradasPATH
.Essa função (somente Bash) faz a "coisa certa" nas situações acima (com uma exceção, veja abaixo), retorna códigos de erro e imprime boas mensagens para humanos. Os códigos e mensagens de erro podem ser desativados quando não são desejados.
A exceção é que essa função não canoniza caminhos adicionados
PATH
por outros meios, portanto, se um alias não canônico de um caminho estiver inseridoPATH
, isso adicionará uma duplicata. Tentar canonizar caminhos já existentesPATH
é uma proposição arriscada, pois um caminho relativo tem um significado óbvio quando passado para,prepath
mas quando já está no caminho, você não sabe qual era o diretório de trabalho atual quando foi adicionado.fonte
$PATH
antes. Quanto a-r
, não, acho que caminhos relativos$PATH
são pouco confiáveis e estranhos (seu caminho muda toda vez que vocêcd
!) Para oferecer suporte a algo assim em uma ferramenta geral.Para mim (no Mac OS X 10.9.5), adicionar o nome do caminho (por exemplo
/mypathname
) ao arquivo/etc/paths
funcionou muito bem.Antes de editar,
echo $PATH
retorna:Após editar
/etc/paths
e reiniciar o shell, a variável $ PATH é anexada/pathname
. De fato,echo $PATH
retorna:O que aconteceu é que
/mypathname
foi anexado à$PATH
variável.fonte
Para adicionar um novo caminho à
PATH
variável de ambiente:Para que essa alteração seja aplicada a todos os shell que você abrir, adicione-o ao arquivo que o shell fornecerá quando for chamado. Em conchas diferentes, isso pode ser:
por exemplo
Você pode ver o caminho fornecido na saída acima.
fonte
Aqui está a minha solução:
Um forro fácil e agradável que não deixa rastro
:
fonte