O que há PATH
em um Mac OS? Usei-o para instalar ferramentas globais de linha de comando, mas a única documentação que encontrei são tutoriais para fazer exatamente isso, sem nenhuma explicação real do que está acontecendo sob o capô. Também não encontrei uma página relevante na Wikipedia .
Então, qual é o objetivo PATH
e qual a diferença entre /etc/paths
e ~/.bash_profile
**?
Por exemplo, no meu paths
arquivo, vejo o seguinte:
/usr/bin
/bin
/usr/sbin
/sbin
/usr/local/bin
Mas no meu ~/.bash_profile
, eu vejo isso:
# Setting PATH for Python 2.7
# The orginal version is saved in .bash_profile.pysave
PATH="/Library/Frameworks/Python.framework/Versions/2.7/bin:${PATH}"
export PATH
Isso é apenas uma adição específica do usuário ao paths
arquivo? O que é tudo isso em paths
, como /usr/bin
?
Respostas:
1. Qual é o propósito do PATH?
PATH
é uma variável de ambiente que contém uma lista de diretórios separados por dois pontos em que seu shell procurará executáveis que você nomeia na linha de comando sem fornecer um caminho explícito para eles (como no seujsdoc
exemplo). Assim, se o seuPATH
tiverqualquer executável que você chamar pelo nome será pesquisado nesses diretórios (nessa ordem) e o primeiro executável encontrado será aquele executado.
2. Qual é a diferença entre / etc / caminhos e ~ / .bash_profile
De acordo com esta pergunta no ServerFault ,
/etc/paths
é usado para definirPATH
globalmente (ou seja, em todo o sistema, para todos os usuários), enquanto~/.bash_profile
é usado para definir preferências por usuário (onde~
será o diretório inicial do usuário). Que está escrito na.bash_profile
lata quer adicionar ao globalPATH
a partir/etc/paths
ou substituí-lo completamente.Para constar,
/etc/paths
parece ser uma peculiaridade do MAC OS: eu não o encontrei no GNU / Linux, pelo menos.fonte
/etc/paths
OSX.É assim que seu shell encontra programas. Quando você digita
ls
, por exemplo, que está executando um programa chamadols
que reside na/bin
maioria dos sistemas, incluindo o Mac OS X. Seu shell só pode encontrar isso porque/bin
está noPATH
.O shell procura por programas em
PATH
ordem, da esquerda para a direita. Se houver doisls
programas no seu sistema, e os diretórios deles estiverem no seuPATH
, ele encontrará aquele no diretório listado primeiro no seuPATH
.Os caminhos definidos
/etc/paths
são adicionados àPATH
inicialização em 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 será enviadotcsh
ezsh
, por exemplo - alterações feitas para/etc/bashrc
não se aplicarem ao seu 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 no seu Mac, não gostaria de adicionar diretórios aos/etc/paths
quais não deseja que apareçam nos de todosPATH
. O mesmo vale para/etc/bashrc
, exceto o curso que se aplica apenas aos usuários que usam o Bash como shell.Você geralmente vê apenas a variável sem o sigilo quando está definindo a variável.
FOO=bar
define aFOO
variável de ambiente para a sequênciabar
. Se você digitarset
, o shell mostrará todas as variáveis de ambiente e, nesse caso, você também verá a variável sem nenhum sinal.$PATH
e${PATH}
geralmente são intercambiáveis. Eles dizem ao shell para expandir oPATH
valor da variável atual no local. A diferença tem a ver com como e onde você os usa. Por exemplo:No segundo
echo
comando, o shell não imprime nada porque solicita que o shell imprima uma variável chamadaFOOx
, que não existe; o shell trata variáveis inexistentes como vazias. Como o terceiroecho
usa a sintaxe entre chaves, ele permite que o shell veja que você está solicitando aFOO
variável e que essex
é apenas outro caractere que você deseja imprimir imediatamente depois.Há uma outra maneira de obter o mesmo efeito sem chaves, a propósito:
As variáveis de ambiente são expandidas entre aspas duplas e as aspas separam a
x
expansão da variável para que o shell faça a coisa certa.Estou usando a
FOO
variável de ambiente aqui apenas para maior clareza. Tudo o que escrevi acima se aplica tambémPATH
, pois é apenas outra variável de ambiente. Os textos de exemplo seriam apenas muito mais longos.Tomando o
FOO
exemplo acima , se você executasse outro programa, ele não veria aFOO
variável porque não é exportada. Ele vive apenas nessa instância de shell:Quando executo um novo
bash
shell com o que eu já estava usando e tento mostrar o valor deFOO
, fico em branco porqueFOO
não foi exportado para os subprogramas. Então saí da segundabash
instância, exportei, executeibash
novamente e agora a segunda instância vê o valor deFOO
.Você usa
export
quando deseja que os subprogramas vejam os valores definidos no shell e não usa quando não deseja que isso aconteça.Normalmente, não exporto variáveis temporárias em scripts de shell, porque não quero que elas alterem como os programas são executados a partir desse script de shell.
Não vou responder a nenhuma de suas outras perguntas. Você só deve fazer uma pergunta de cada vez. Eu só respondi isso muitas vezes porque elas são vagamente relacionadas. Todo o resto pertence a uma pergunta separada.
fonte