O que é PATH em um Mac OS?


12

O que há PATHem 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 PATHe qual a diferença entre /etc/pathse ~/.bash_profile**?

Por exemplo, no meu pathsarquivo, 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 pathsarquivo? O que é tudo isso em paths, como /usr/bin?


2
Por favor, não combine várias perguntas em uma única postagem. Cada uma das suas perguntas será bem-vinda aqui separadamente, mas nem todas juntas assim. Reduza isso para uma única pergunta, você pode combinar 1 e 2, mas os outros não têm nada a ver com PATH especificamente. 3 é respondido aqui 4 é explicado aqui e 5 não faz muito sentido, receio. Sua pergunta sobre bônus também, quais arquivos são binários? Os scripts não são.
— terdon

Eu editei minha pergunta para baixo. Além disso, achei esses links úteis. Obrigado.
— gwg

Respostas:


15

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 seu jsdocexemplo). Assim, se o seu PATHtiver

/usr/bin:/bin:/home/bin

qualquer 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 definir PATHglobalmente (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_profilelata quer adicionar ao global PATHa partir /etc/pathsou substituí-lo completamente.

Para constar, /etc/pathsparece ser uma peculiaridade do MAC OS: eu não o encontrei no GNU / Linux, pelo menos.


Acabei de editá-los, mas obrigado por responder a todos!
— gwg

@ggundersen Eu cortei minha resposta para atender à sua pergunta editada.
— Joseph R.

@ ggundersen você também pode querer ler minha resposta e os links sobre o /etc/pathsOSX.
— terdon

7

Qual é o propósito do PATH?

É assim que seu shell encontra programas. Quando você digita ls, por exemplo, que está executando um programa chamado lsque reside na /binmaioria dos sistemas, incluindo o Mac OS X. Seu shell só pode encontrar isso porque /binestá no PATH.

O shell procura por programas em PATHordem, da esquerda para a direita. Se houver dois lsprogramas no seu sistema, e os diretórios deles estiverem no seu PATH, ele encontrará aquele no diretório listado primeiro no seu PATH.

Qual é a diferença entre / etc / caminhos e ~ / .bash_profile

Os caminhos definidos /etc/pathssão adicionados à PATHinicializaçã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á enviado tcshe zsh, por exemplo - alterações feitas para /etc/bashrcnã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/pathsquais não deseja que apareçam nos de todos PATH. O mesmo vale para /etc/bashrc, exceto o curso que se aplica apenas aos usuários que usam o Bash como shell.

Qual é a diferença entre PATH e $ PATH e $ {PATH}?

Você geralmente vê apenas a variável sem o sigilo quando está definindo a variável. FOO=bardefine a FOOvariável de ambiente para a sequência 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 sinal.

$PATHe ${PATH}geralmente são intercambiáveis. Eles dizem ao shell para expandir o PATHvalor da variável atual 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 echocomando, o shell não imprime nada porque solicita que o shell imprima uma variável chamada FOOx, que não existe; o shell trata variáveis ​​inexistentes como vazias. Como o terceiro echousa a sintaxe entre chaves, ele permite que o shell veja que você está solicitando a FOOvariável e que esse xé apenas outro caractere que você deseja imprimir imediatamente depois.

Há uma 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 as aspas separam a xexpansão da variável para que o shell faça a coisa certa.

Estou usando a FOOvariável de ambiente aqui apenas para maior clareza. Tudo o que escrevi acima se aplica também PATH, pois é apenas outra variável de ambiente. Os textos de exemplo seriam apenas muito mais longos.

O que significa PATH de exportação? Quando exportamos?

Tomando o FOOexemplo acima , se você executasse outro programa, ele não veria a FOOvariável porque não é exportada. Ele vive apenas nessa instância de shell:

$ echo $FOO
bar
$ bash
$ echo $FOO

$ exit
$ export FOO
$ bash
$ echo $FOO
bar

Quando executo um novo bashshell com o que eu já estava usando e tento mostrar o valor de FOO, fico em branco porque FOOnão foi exportado para os subprogramas. Então saí da segunda bashinstância, exportei, executei bashnovamente e agora a segunda instância vê o valor de FOO.

Você usa exportquando 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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.