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?

gwg
fonte
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.

Joseph R.
fonte
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.

Warren Young
fonte