Como definir permanentemente o $ PATH no Linux / Unix?

880

Estou tentando adicionar um diretório ao meu caminho, para que ele sempre esteja no meu caminho do Linux. Eu tentei:

export PATH=$PATH:/path/to/dir

Isso funciona, no entanto, sempre que eu saio do terminal e inicio uma nova instância do terminal, esse caminho é perdido e preciso executar o comando de exportação novamente.

Como posso fazer isso para que isso seja definido permanentemente?

Click Voto a favor
fonte

Respostas:

230

Existem várias maneiras de fazer isso. A solução real depende do objetivo.

Os valores das variáveis ​​geralmente são armazenados em uma lista de atribuições ou em um script de shell que é executado no início da sessão do sistema ou do usuário. No caso do script de shell, você deve usar uma sintaxe específica do shell e exportouset comandos.

No âmbito do sistema

  1. /etc/environmentLista de atribuições únicas, permite referências. Perfeito para adicionar diretórios de todo o sistema, como /usr/local/something/bina PATHvariável ou definir JAVA_HOME. Usado pelo PAM e SystemD.
  2. /etc/environment.d/*.confLista de atribuições únicas, permite referências. Perfeito para adicionar diretórios de todo o sistema, como /usr/local/something/bina PATHvariável ou definir JAVA_HOME. A configuração pode ser dividida em vários arquivos, geralmente um por cada ferramenta (Java, Go, NodeJS). Usado pelo SystemD que, por design, não passa esses valores para os shells de login do usuário.
  3. /etc/xprofileScript de shell executado ao iniciar a sessão do Sistema X Window. Isso é executado para todos os usuários que efetuam login no X Window System. É uma boa opção para PATHentradas válidas para todos os usuários como/usr/local/something/bin . O arquivo é incluído por outro script, portanto, use a sintaxe do shell POSIX e não a sintaxe do shell do usuário.
  4. /etc/profilee /etc/profile.d/*script Shell. Essa é uma boa opção para sistemas somente de shell. Esses arquivos são lidos apenas por shells no modo de login.
  5. /etc/<shell>.<shell>rc. Script de shell. Esta é uma péssima escolha porque é específica do shell único. Usado no modo não-login.

Sessão de usuário

  1. ~/.pam_environment. Lista de atribuições exclusivas, sem referências permitidas. Carregado pelo PAM no início de cada sessão do usuário irrelevante se for uma sessão ou shell do X Window System. Você não pode fazer referência a outras variáveis, incluindo HOMEou PATHassim que tem uso limitado. Usado pelo PAM.
  2. ~/.xprofileScript de shell. Isso é executado quando o usuário efetua login no sistema X Window System. As variáveis ​​definidas aqui são visíveis para todos os aplicativos X. Escolha perfeita para estender PATHcom valores como ~/binou ~/go/binou definir usuário GOPATHou específico NPM_HOME. O arquivo é incluído por outro script, portanto, use a sintaxe do shell POSIX e não a sintaxe do shell do usuário. Seu editor de texto gráfico ou IDE iniciado pelo atalho verá esses valores.
  3. ~/.profile, ~/.<shell>_profile, ~/.<shell>_loginShell script. Será visível apenas para programas iniciados no terminal ou emulador de terminal. É uma boa opção para sistemas somente de shell. Usado por shells no modo de login.
  4. ~/.<shell>rc. Script de shell. Esta é uma péssima escolha porque é específica do shell único. Usado por shells no modo sem login.

Notas

O Gnome em Wayland inicia o shell de login do usuário para obter o ambiente. Ele usa efetivamente configurações shell de login ~/.profile, ~/.<shell>_profile,~/.<shell>_login arquivos.

Manuais

  • meio Ambiente
  • environment.d
  • bater
  • traço

Documentação específica de distribuição

Relacionado

Diferença entre o Shell de Login e o Shell Não-Login?

Grzegorz Żur
fonte
4
Obrigado pela resposta detalhada, isso deve ser mais alto. Talvez também .bash_profiledeva ser adicionado à lista?
James Ko
2
@JamesKo que era o número 4
trve.fa7ad
1
Eu acho que a melhor resposta é sugerida /etc/environment. Mas posso atualizá-lo sem sair e entrar? Às vezes eu não uso bash ou sh, então source /etc/environmentnão funciona.
usar o seguinte código
2
Ótimo e, na minha opinião, a resposta mais completa. Deve ser muito mais alto.
22618 Peter Gloor
2
Meu motivo para pesquisar esse tópico foi, na verdade, Go. Fico feliz em ver que não sou o único que percebeu que .bashrc não é o lugar certo. ;)
Peter Gloor
1039

Você precisa adicioná-lo ao seu arquivo ~/.profileou ~/.bashrc. 

export PATH="$PATH:/path/to/dir"

Dependendo do que você está fazendo, você também pode querer vincular os binários:

cd /usr/bin
sudo ln -s /path/to/binary binary-name

Observe que isso não atualizará automaticamente o caminho para o restante da sessão. Para fazer isso, você deve executar:

source ~/.profile 
or
source ~/.bashrc
mpowered
fonte
11
Algumas perguntas. 1) Não deve haver dois pontos entre $PATHe /usr/bin. 2) Deveria /usr/binestar lá. 3) Você não deveria preferir usar /usr/local/bin?
Batandwa
197
Observe : geralmente é considerado um problema de segurança deixar dois pontos à direita no final do seu caminho bash, porque faz com que o bash procure no diretório atual se não conseguir encontrar o executável que está procurando. Os usuários que encontrarem esta postagem procurando mais informações devem ser avisados ​​disso.
erewok
51
@AdamRobertson Não é seguro - considere o cenário ao descompactar um tarball, depois cdpara o diretório em que ele foi descompactado e, em seguida, execute ls--- e então perceba que o tarball tinha um programa malicioso lsnele.
Lily Chung
21
Para mim, foi .bash_profile, não .profile. Parece que isso é diferente para todos.
Donquixote
9
Eu acho que melhorei significativamente a qualidade desta resposta e resolvi alguns problemas que outros usuários levantaram. Toda exportação de caminho ou todo comando que ajusta o caminho deve sempre separar um caminho existente com dois pontos. Dois pontos à esquerda ou à direita nunca devem ser usados ​​e o diretório atual nunca deve estar no caminho.
Erick Robertson
243

No Ubuntu, edite /etc/environment. Seu único objetivo é armazenar variáveis ​​de ambiente. Originalmente, a variável $ PATH é definida aqui. Esta é uma pasta do meu /etc/environmentarquivo:

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"

Assim, você pode simplesmente abrir esse arquivo como root e adicionar o que quiser.

Para resultados imediatos, execute (tente como usuário e root normais ):

source /etc/environment && export PATH

ATUALIZAR:

Se você usar zsh(também conhecido como Z Shell), adicione esta linha logo após os comentários em /etc/zsh/zshenv:

source /etc/environment

Encontrei essa pequena peculiaridade no Ubuntu 15.10, mas se o seu zsh não está recebendo o caminho correto , talvez seja por isso

trve.fa7ad
fonte
13
Nem todo sistema possui / etc / environment
user3439968 14/11
9
O FWIW $PATHtambém é definido /etc/profileno Arch Linux.
Sparhawk
3
@ e-sushi Estou realmente chocado com isso. Estou no ubuntu 14.04.1. e posso prometer que o arquivo foi incorporado.
trve.fa7ad
2
Depois de tentar todas as sugestões sob o sol, mas / etc / environment, e tendo todas elas NÃO funcionando, eu finalmente me deparei com isso. Também estou no Ubuntu 14.04 e este é o único que realmente mudou a variável PATH após a reinicialização.
Chockomonkey 24/03
4
O usuário deve reiniciar o PC após atualizar o arquivo do ambiente.
Harish_N 24/03
71

Coloque a exportdeclaração ~/.bashrc. Meu .bashrc contém isso:

export PATH=/var/lib/gems/1.8/bin:/home/fraxtil/.bin:$PATH
Fraxtil
fonte
7
é necessário reiniciar?
Click Upvote
2
Funcionou quando eu coloquei isso no .profile', não encontrei.bashrc
Clique em Upvote
Pode ser dependente do sistema exato; Não sei exatamente quais condições determinam qual arquivo é executado. Ainda bem que o problema foi resolvido.
Fraxtil
12
@Click Upvote Você precisa fazer isso source ~/.bashrcpara recarregar a .bashrcconfiguração. Em seguida, ele irá trabalhar
BigSack
4
A exportpalavra-chave é necessária apenas se PATHainda não estiver sinalizada como uma variável de ambiente - o que será quase incondicionalmente. Simplesmente PATH=/var/lib/gems/1.8/bin:/home/fraxtil/.bin:$PATHteria o mesmo efeito.
Charles Duffy
30

Você pode definir $PATHpermanentemente de duas maneiras.

  1. Para definir o caminho para um usuário específico: pode ser necessário fazer a entrada no .bash_profilediretório inicial do usuário.

    por exemplo, no meu caso, definirei o caminho do java no perfil de usuário do tomcat

    [tomcat]$ echo "export PATH=$PATH:/path/to/dir" >> /home/tomcat/.bash_profile
  2. Para definir o caminho comum para TODOS os usuários do sistema, pode ser necessário definir o caminho da seguinte maneira:

    [root~]# echo "export PATH=$PATH:/path/to/dir" >> /etc/profile
Mohit M
fonte
3
O arquivo está nomeado /etc/profilescom uma sna sua distribuição? O meu não tem s. Eu acho que você tem um erro de digitação.
22414 Chris
3
Você provavelmente deseja escapar do $ que está gravando no arquivo de perfil. por exemplo, echo "export PATH = \ $ PATH: / caminho / para / dir" >> / etc / profile, dessa forma você realmente anexa à variável quando esse script é executado, em vez de configurá-la para um valor literal com base no seu valor no hora de executar este comando inicial.
precisa saber é o seguinte
15

Você pode usar no Centos ou RHEL para usuário local:

echo $"export PATH=\$PATH:$(pwd)" >> ~/.bash_profile

Isso adiciona o diretório atual (ou você pode usar outro diretório) ao PATH, tornando-o permanente, mas entra em vigor no próximo logon do usuário.

Se você não quiser fazer um novo logon, poderá usar:

source ~/.bash_profile

Que recarregar o # User specific environment and startup programscomentário está presente em.bash_profile

Daniel Antonio Nuñez Carhuayo
fonte
12

Você também pode definir permanentemente, editando um destes arquivos:

/etc/profile (para todos os usuários)

~/.bash_profile (para usuário atual)

~/.bash_login (para usuário atual)

~/.profile (para usuário atual)

Você também pode usar /etc/environmentpara definir uma variável de ambiente PATH permanente, mas ela não suporta expansão de variável .

Extraído de: http://www.sysadmit.com/2016/06/linux-anadir-ruta-al-path.html

Delucaramos
fonte
7

Eu me deparei com essa pergunta ontem ao procurar uma maneira de adicionar uma pasta contendo meus próprios scripts ao PATH - e fiquei surpreso ao descobrir que meu próprio ~/.profilearquivo (no Linux Mint 18.1) já continha isso:

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

Assim, tudo que eu precisava fazer era criar a pasta ~/bine colocar meus scripts lá.

RobertG
fonte
7

Eu acho que a maneira mais elegante é:

1. adicione isso no arquivo ~ / .bashrc Execute este comando

gedit ~ / .bashrc

adicione seu caminho dentro dele

exportar PATH = $ PATH: / opt / node / bin

2.source ~ / .bashrc

(Ubuntu)

Himanshu sharma
fonte
6

Você pode adicionar essa linha ao arquivo de configuração do console (por exemplo, .bashrc) ou ao .profile

aqua
fonte
2
Não tenho nenhum desses arquivos em/home/(username)
Clique em Upvote
3
@ClickUpvote: Qual shell você usa? (E arquivos que começam com um ponto estão escondidos, você precisa de algo como ls -aa vê-los.)
David Schwartz
Incase você não tem nenhum desses arquivos (bashrc ou perfil), você pode criar manualmente-los e eles serão automaticamente usado
trve.fa7ad
4

Adicionar permanentemente variável PATH

Global:

echo "export PATH=$PATH:/new/path/variable" >> /etc/profile

Local (apenas para usuário):

echo "export PATH=$PATH:/new/path/variable" >> ~/.profile

Para reinicialização global . Para logon local .

Exemplo

Antes:

$ cat /etc/profile 

#!/bin/sh

export PATH=/usr/bin:/usr/sbin:/bin:/sbin

Depois de:

$ cat /etc/profile 

#!/bin/sh

export PATH=/usr/bin:/usr/sbin:/bin:/sbin
export PATH=/usr/bin:/usr/sbin:/bin:/sbin:/new/path/variable

Como alternativa, você pode apenas editar o perfil:

$ cat /etc/profile 

#!/bin/sh

export PATH=/usr/bin:/usr/sbin:/bin:/sbin:/new/path/variable

Outra maneira (obrigado gniourf_gniourf):

echo 'PATH=$PATH:/new/path/variable' >> /etc/profile

Você não deve usar aspas duplas aqui! echo 'export PATH = $ PATH: / new / path / variable' ... E, a propósito, a palavra-chave export é muito provavelmente inútil, pois a variável PATH provavelmente já está marcada como exportada. - gniourf_gniourf

user3439968
fonte
1
Não. Você não deve usar aspas duplas aqui! echo 'export PATH=$PATH:/new/path/variable'... E, a propósito, exporté muito provável que a palavra-chave seja inútil, pois a PATHvariável provavelmente já está marcada como exportada.
gniourf_gniourf
Não, você deve usar aspas duplas porque $ PATH em aspas simples não interpoladas. E a exportação BTW também é útil.
user3439968
Deixa comigo. Você pode usar aspas duplas ou aspas simples, porque $ PATH interpolou quando o eco foi executado ou interpolou quando o / etc / profile é executado.
user3439968
1
@ user3439968, na verdade, as aspas duplas causarão muitos problemas se você anexar a $ PATH a partir de vários arquivos. Considere: quando você usa aspas duplas, $ PATH é convertido em uma sequência estática com todos os diretórios PATH definidos anteriormente. diga que você anexa /usr/localusando ~/.bashrc. agora se você deseja anexar /opt/binà mesma variável usando /etc/bash.bashrc; $ PATH será convertido para a mesma sequência estática, como resultado, $ PATH será substituído em vez de anexado a ... Será uma questão de preferência do sistema para um arquivo sobre outro
trve.fa7ad
4

1. modifique o arquivo "/ etc / profile".

#vi /etc/profile

Pressione a tecla "i" para entrar no status de edição e mover o cursor para o final do arquivo. Entradas adicionais:

export PATH=$PATH:/path/to/dir;

Pressione a tecla "Esc" para sair do status de edição, ': wq' salve o arquivo.

2. Tornar a configuração eficaz

source /etc/profile

Explicar: o arquivo de perfil funciona para todos os usuários; se você quiser ser válido apenas para o usuário ativo, defina o arquivo ".bashrc"

Jia
fonte
4

Depois de tanta pesquisa, encontrei uma solução simples para isso (estou usando o SO elementar ), inspirada no seguinte link .

Execute o seguinte comando para abrir o arquivo .bashrc no modo de edição . [Você também pode usar o vi ou qualquer outro editor].

~$ sudo nano ~/.bashrc

Adicione a seguinte linha no final do arquivo e salve.

export PATH="[FLUTTER_SDK_PATH]/flutter/bin:$PATH"

Por exemplo :

export PATH="/home/rageshl/dev/flutter/bin:$PATH"

insira a descrição da imagem aqui

Eu acredito que esta é a solução permanente para definir o caminho no flutter na distribuição Ubuntu

Espero que isso seja útil.

Ragesh S
fonte
3

os arquivos nos quais você adiciona o comando export dependem se você estiver no modo de logon ou não.

se você estiver no modo de login, os arquivos que você está procurando são / etc / bash ou /etc/bash.bashrc

se você não estiver no modo de login, estará procurando o arquivo /.profile ou os arquivos no diretório /.profiles.d

os arquivos mencionados acima se estiverem as variáveis ​​do sistema.

Dikinha
fonte
3

Adicionar a /etc/profile.dpasta de script [name_of_script].shcom a linha: export PATH=$PATH:/dir. Todo script dentro da /etc/profile.dpasta é executado automaticamente /etc/profileno login.

Yuriy
fonte
É a maneira recomendada de como personalizar seu ambiente
Yuriy
1
Isso é apenas se você desejar que as configurações sejam de todo o sistema, o que provavelmente não é o caso de uso mais comum. A maioria das pessoas deseja (ou deveria desejar) que o caminho seja definido localmente, porque a maioria dos usuários / funções está realizando operações contextualmente diferentes e, quanto menos suposições você fizer, melhor.
usar o seguinte comando
@ alimentado, sim, isso é apenas para todo o sistema. Se você deseja alterar localmente PATH, adicione a mesma exportação em ~ / .profile ou ~ / .bashrc. Aqui você deve considerar que os shells de login leem ~ / .profile e os shells interativos leem ~ / .bashrc. Isso é muito importante porque o ssh, por exemplo, não faz um login, portanto, ~ / .profile não será lido. Várias distribuições como suse source ~ / .bashrc em / etc / profile. Mas não é comum para todos os linux '
Yuriy
3

Zues77 tem a idéia certa. O OP não disse "como posso abrir caminho"? O OP queria saber como anexar permanentemente a $ PATH:

sudo nano /etc/profile

É aqui que está definido para tudo e é o melhor lugar para alterá-lo para todas as coisas que precisam de $ PATH

Joe D
fonte
3

Minha resposta é, em referência à criação de go-langem Ubuntu linux/amd64.Eu têm enfrentado o mesmo problema de definir o caminho de variáveis de ambiente ( GOPATHe GOBIN), perdê-la na saída do terminal e reconstruí-lo usando a source <file_name>cada erro time.The foi a de colocar o caminho ( GOPATHe GOBIN) na ~/.bash_profilepasta Depois de desperdiçar algumas boas horas, descobri que a solução era colocar GOPATHe GOBINno ~/.bash_rcarquivo da maneira:

export GOPATH=$HOME/go
export GOBIN=$GOPATH/bin
export PATH=$PATH:$GOPATH:$GOBIN

e, assim, a instalação do go funcionou bem e não houve perdas de caminho.

EDIT 1: A razão pela qual esse problema pode estar relacionado é que as configurações para shells sem login, como o terminal ubuntu ou o gnome-terminal onde executamos o código go, são retiradas do ~./bash_rcarquivo e as configurações para shells de login são retiradas do ~/.bash_profilearquivo, e do ~/.profilearquivo se o ~/.bash_profilearquivo estiver inacessível.

Abhiroj Panwar
fonte
3

Digamos que você esteja executando o MacOS e tenha um binário confiável e que gostaria de disponibilizar em todo o sistema, mas não necessariamente deseje o diretório no qual o binário será adicionado ao seu PATH, você pode optar por copiar / mover o binário para /usr/local/bin, que já deve estar no seu caminho. Isso tornará o binário executável como qualquer outro binário ao qual você já tenha acesso no seu terminal.

Leo
fonte
3

Pode ser adicionado diretamente usando o seguinte comando:

echo 'export PATH=$PATH:/new/directory' >> ~/.zshrc
source ~/.zshrc
Anoop Nagabhushan
fonte
2
A pergunta é rotulada bash, de modo que não é muito útil.
Laurenz Albe 11/07
2
Esta é uma resposta válida -> o título menciona apenas Linux, então bash e zsh TAMBÉM vai fazer ... se a marcação é apenas "bash" precisamos adicionar "zsh" para as marcas também
Carlos Saltos
2

a melhor maneira simples é a seguinte linha:
PATH="<directory you want to include>:$PATH"
no seu arquivo .bashrc no diretório inicial.
Ele não será redefinido, mesmo se você fechar o terminal ou reiniciar o seu PC. É permanente

Edward Torvalds
fonte
1
@quant, se você fizer o que foi dito, ele definirá suas configurações permanentemente. funcionará mesmo se você fechar o terminal.
Edward Torvalds
1

Eu acho que a maneira mais elegante é:

1. adicione isso no arquivo ~. / Bashrc

if [ -d "new-path" ]; then
  PATH=$PATH:new-path
fi

2. fonte ~ / .bashrc

(Ubuntu)

Gimcuan Hui
fonte
E para exibir o caminho a seguir: printf "% s \ n" $ PATH
Robot70
1

Uma maneira de adicionar um caminho permanente, que funcionou para mim, é:

    cd /etc/profile.d
    touch custom.sh
    vi custom.sh 
    export PATH=$PATH:/path according to your setting/

reinicie o computador e aqui vamos o caminho, lá permanentemente aplausos.

user6393373
fonte
Na verdade, você não precisa reiniciar o computador. Sair e entrar novamente é suficiente. Essa é uma solução bastante elegante, pois é muito fácil fazer o backup de quaisquer alterações sem a necessidade de editar arquivos. Também é fácil especificar uma instrução if para que, se um diretório não existir no sistema, ele não seja adicionado à variável PATH.
Warwick
0

Para distribuição debian, você precisa:

    - edit ~/.bashrc  e.g: vim ~/.bashrc 
    - add export PATH=$PATH:/path/to/dir
    - then restart your computer. Be aware that if you edit ~/.bashrc  as root, your environment variable you added will work only for root
só eu
fonte
0

Este é um one-liner . Ele adiciona uma linha ao .bashrc. Essa linha vai verificar se o diretório já foi adicionado ao caminho e acrescentar, se não. Isso impedirá a duplicação do diretório no caminho toda vez que você for fonte .bashrc.

echo "[[ \":\$PATH:\" != *\":$(pwd)/path/to/add:\"* ]] && export PATH=\"\${PATH:+\${PATH}}:$(pwd)/path/to/add\"" >> ~/.bashrc

source ~/.bashrc
sr9yar
fonte