What is the purpose of PATH?
É assim que o seu shell encontra programas. Quando você digita ls
, por exemplo, está executando um programa chamado ls
, que vive em /bin
na maioria dos sistemas, incluindo o Mac OS X. Seu shell só consegue encontrar porque /bin
está no PATH
.
O shell pesquisa programas em PATH
order, da esquerda para a direita. Se houver dois programas ls
em seu sistema e seus diretórios estiverem no seu PATH
, ele encontrará o diretório listado primeiro em PATH
.
What is the difference between /etc/paths and ~/.bash_profile
Os caminhos definidos em /etc/paths
são adicionados à PATH
na inicialização de todos os shells no Mac OS X.
~/.bash_profile
é apenas um dos vários scripts de shell executados pelo Bash na inicialização, e vários deles são específicos do Bash. Portanto, se você alterar seu shell - o Mac OS X também envia tcsh
e zsh
, por exemplo - as alterações feitas em /etc/bashrc
não se aplicam ao novo shell.
Além disso, /etc/paths
é um arquivo de configuração no nível do sistema, enquanto ~/.bash_profile
é por usuário. Se você tivesse vários usuários interativos configurados em seu Mac, não desejaria adicionar diretórios a /etc/paths
que você não queria que aparecessem em PATH
de todos. O mesmo vale para /etc/bashrc
, exceto que, é claro, isso se aplica apenas a usuários que usam o Bash como shell.
What is the difference between PATH and $PATH and ${PATH}?
Você normalmente só vê a variável sem o sigilo quando está configurando a variável. FOO=bar
define a variável de ambiente FOO
como a string bar
. Se você digitar set
, o shell mostrará todas as variáveis de ambiente e, nesse caso, você também verá a variável sem nenhum sigilo.
$PATH
e ${PATH}
são geralmente intercambiáveis. Eles dizem ao shell para expandir o valor atual da variável PATH
no local. A diferença tem a ver com como e onde você os usa. Por exemplo:
$ FOO=bar
$ echo $FOO
bar
$ echo $FOOx
$ echo ${FOO}x
barx
No segundo comando echo
, o shell não imprime nada porque pede ao shell para imprimir uma variável chamada FOOx
, que não existe; o shell trata variáveis inexistentes como vazias. Como o terceiro echo
usa a sintaxe de chave de caracteres, ele permite que o shell veja que você está solicitando a variável FOO
e que o x
é apenas outro caractere que você deseja imprimir imediatamente a seguir.
Existe outra maneira de obter o mesmo efeito sem chaves, a propósito:
$ echo "$FOO"x
barx
As variáveis de ambiente são expandidas entre aspas duplas, e aspas separam o x
da expansão da variável, de modo que a casca faz a coisa certa.
Estou usando a variável de ambiente FOO
aqui apenas para maior clareza. Tudo o que escrevi acima se aplica igualmente a PATH
, já que é apenas outra variável de ambiente. Os textos de exemplo seriam muito mais longos.
What does export PATH mean? When do we export?
Tomando o exemplo acima de FOO
, se você executasse outro programa, ele não veria a variável FOO
porque ela não é exportada. Ele vive apenas dentro dessa instância de um shell:
$ echo $FOO
bar
$ bash
$ echo $FOO
$ exit
$ export FOO
$ bash
$ echo $FOO
bar
Quando executo pela primeira vez um novo shell bash
abaixo do que eu já estava usando, tente mostrar o valor de FOO
, obtenho um espaço em branco porque FOO
não foi exportado para subprogramas para ver . Em seguida, saí da segunda bash
instance, exportei-a, executei bash
novamente e agora a segunda instância vê o valor de FOO
.
Você usa export
quando quiser que subprogramas ver os valores definidos no shell e não os use quando não quiser que isso aconteça.
Normalmente, não exporto variáveis temporárias em scripts de shell, porque não quero que eles modifiquem como os programas executados a partir desse script de shell se comportam.
Não vou responder a nenhuma das suas outras perguntas. Você só deveria fazer uma pergunta de cada vez. Eu só respondi isso porque eles estão vagamente relacionados. Tudo o resto pertence a uma questão separada.