Todo sistema é recheado de “variáveis de ambiente”, valores que podem ser consultados e alterados para dar suporte a diversos tipos de execução. No Linux, a variável PATH é uma das mais importantes, pois serve para achar os principais arquivos executáveis. Prometo que depois deste artigo você nunca mais vai perder seu caminho. 👀
A variável PATH no Linux contém uma série de diretórios em que o terminal procura pela existência do comando digitado sem o seu caminho completo. Por exemplo, se você digitar o comando tree
, o bash vai consultar a variável PATH, retornando o diretório /usr/bin onde o tree está armazenado e por fim vai executar o caminho completo /usr/bin/tree
.
E que tal dominar ainda mais o terminal e controle de variáveis com o nosso Curso de Terminal Linux Bash? Nele você vai aprender a “falar a língua do terminal” do iniciante ao avançado e como controlar processos e tarefas para aumentar sua produtividade.
Como funciona a variável $PATH no Linux?
Cada distribuição Linux vem com diferentes valores em PATH. Mas como é uma “variável”, você pode alterar de modo temporário (para testar) ou permanente (que dura mesmo após o boot).
Veja a diferença do $PATH no Linux em diferentes distros como o Parrot, Fedora e o OpenSUSE:
parrot:$> printenv PATH
/home/neo/.local/bin:/snap/bin:/usr/sandbox/:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/usr/share/games:/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
fedora:$> printenv PATH
/home/neo/.local/bin:/home/neo/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin
opensuse:$> printenv PATH
/home/neo/bin:/usr/local/bin:/usr/bin:/bin
Se o mesmo executável existir em mais de um diretório presente em PATH, será executado o que estiver no diretório mais à esquerda da sequência. E para ficar fera no conceito de caminhos no Linux e entender porque nele não existe o “C:\” do Windows, recomendamos este vídeo super completo sobre o assunto:
Se você quiser ver todas as variáveis do seu sistema, digite somente printenv
. A saída pode ser bem longa.
$> printenv
Erros mais comuns de $PATH
Se você digitar um comando que não for achado em PATH, o seguinte erro é apresentado.
$> meuscript
bash: meuscript: command not found…
Agora veja o erro ao criar o arquivo “meuscript” no diretório /home/neo/bin, existente em PATH, mas sem dar permissão de execução.
$> meuscript
bash: /home/neo/bin/meuscript: Permission denied
Consultando o caminho de um executável
Você também pode consultar o caminho de um executável existente em PATH no Linux com o comando which
.
$> which meuscript
/home/neo/bin/meuscript
$> which tree
/usr/bin/tree
Como adicionar um diretório em $PATH
Para adicionar um diretório, é preciso tomar cuidado para não sobrepor o conteúdo original e assim bloquear as execuções do seu sistema. Para fazer isso, daremos um comando que primeiro lê o conteúdo atual e depois concatena o novo.
Neste exemplo, primeiro criamos o diretório “meusprogramas”:
$> mkdir /home/neo/meusprogramas
Depois vamos incluir na variável, digitando o seguinte:
$> export PATH=$PATH:/home/neo/meusprogramas
Onde:
- export >> comando do bash para definir uma variável acessível por qualquer processo filho dele;
- PATH >> o nome da variável, sempre em LETRAS MAIÚSCULAS, que é o padrão POSIX;
- $PATH >> ao usar $NOME_DA_VARIÁVEL, retorna o valor atual armazenado;
- : >> dois pontos é o separador de valores convencionado para PATH;
- /home/neo/meusprogramas >> o novo valor que estamos adicionando.
Para ver como ficou, basta consultar assim:
$> printenv PATH
/home/neo/bin:/usr/local/bin:/usr/bin:/bin:/homeneo/meusprogramas
Porém, o comando export só vale para a sessão atual do bash. Ao abrir um novo terminal ou reiniciar o computador, a variável volta ao que era antes.
Como adicionar um diretório permanente em $PATH no Linux
Para tornar a alteração permanente, será preciso dar a mesma instrução em algum script usado no boot do sistema.
Para fazer de modo global, para todos os usuários do sistema, geralmente fazemos isso no arquivo /etc/profile (lembrando que a pasta a ser adicionada também tem que ser acessível para todos). Dizemos “geralmente” porque pode haver diferenças significativas no modo em que uma distro opera seus scripts.
Algumas distribuições podem criar scripts filhos justamente para esse tipo de personalização, de modo que ao fazer uma atualização do sistema suas alterações sejam preservadas. Em distribuições bem documentadas, logo no início do arquivo há uma explicação se você pode ou não fazer alterações ali mesmo ou se deve fazer num arquivo filho (a Suse Enterprise, por exemplo, usa /etc/profile como principal e recomenda que personalizações sejam feitas no filho /etc/profile.local).
Para fazer isso somente para o usuário atual, podemos usar o arquivo /home/[nome_do_usuário]/.bash_profile
ou /home/[nome_do_usuário]/.profile
(dependendo de sua distribuição estes arquivos ainda podem variar)
Para adicionar somente para você, abra o arquivo ~/.bash_profile ou ~/.profile com o editor de textos de sua escolha, como o vim
, o meu preferido. O ~ (til) também é uma variável do sistema e aponta para o diretório home do usuário atual (em nosso exemplo, o ~ tem o valor /home/neo).
$> vim ~/.bash_profile
Acrescente a seguinte linha no final do arquivo (se colocar em outro trecho, corre o risco de outra parte do script sobrepor seu comando), alterando o trecho “neo/meusprogramas” pelo caminho que você desejar:
export PATH=$PATH:/home/neo/meusprogramas
Depois de editar e salvar, você precisa dar um source para o script ser lido e começar a valer (mas se abrir um novo terminal já funciona também):
$> source ~/.profile
ou
$> source ~/.bash_profile
Conclusão
Ao personalizar a variável PATH, poderá habilitar seu sistema a localizar scripts e programas que não são instalados e que você deseje organizar em pastas próprias, como dentro da sua /home, por exemplo. Você também pode criar atalhos de desktop dentro do seu KDE, GNOME, XFCE etc. Para um programa gráfico, isso funcionará bem. Mas se for um script que precise receber parâmetros de entrada no momento da execução, não será uma boa alternativa porque você não consegue fazer isso como faz pela linha de comando.
Como existe muita diferença nos valores de PATH entre as diferentes distribuições e mesmo que você não precise alterar por conta de algum script personalizado, é bem comum se deparar com programas que estão corretamente instalados, mas que não executam por não ter o caminho reconhecido.
Agora você já sabe como resolver este problema, bastando identificar o caminho do seu programa e adicioná-lo na variável PATH.