O que significa exportar PATH = algo: $ PATH significa?

27

Eu sou muito novo no Linux e coloquei o seguinte comando no final do arquivo .profilena minha pasta pessoal:

export PATH="~/.composer/vendor/bin:$PATH"

Conheço um pouco os problemas das variáveis ​​de ambiente e seus valores no Windows, mas, neste caso, quero entender o que esse comando faz e quais são as partes que ele compreende:

  1. O que é essa frase de "exportação" no início? Está exportando os dados para estarem disponíveis para o Bash?

  2. Qual é o primeiro PATHe o que é o segundo $PATH, e por que precisamos de dois?

JohnDoea
fonte
Algumas diferenças técnicas entre os sistemas operacionais à parte, é equivalente a esse processo no Windows: windowsitpro.com/systems-management/…
Alquimista de dois bits
1
"export" torna a alteração visível para novos programas lançados pelo bash.
Thorbjørn Ravn Andersen
1
@ ThorbjørnRavnAndersen: não, isso acontece se você usa ou não o exportcomando, porque a PATHvariável já está marcada como exportada. (Experimente as duas coisas se você não acredita em mim!)
David

Respostas:

39

O que é essa frase de "exportação" no início?

exporté um comando (mais precisamente, é um built-in do Bash , ou seja, não é um presente executável PATH, é um comando que o Bash possui por si só).

Está exportando os dados para estarem disponíveis para o Bash?

exportdefine a variável de ambiente no lado esquerdo da atribuição como o valor no lado direito da atribuição; essa variável de ambiente é visível para o processo que a define e para todos os subprocessos gerados no mesmo ambiente, ou seja, neste caso para a instância do Bash que origina ~/.profilee para todos os subprocessos gerados no mesmo ambiente (que podem incluir, por exemplo, outras conchas , que por sua vez poderá acessá-lo).

Qual é o primeiro PATHe o que é o segundo $PATH, e por que precisamos de dois?

O primeiro, PATHconforme explicado acima, é a variável de ambiente a ser definida usando export.

Como PATHnormalmente contém algo quando ~/.profileé originário (por padrão, ele contém /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games), simplesmente definir PATHcomo ~/.composer/vendor/binfaria PATHconter apenas ~/.composer/vendor/bin.

Portanto, como as referências a uma variável em um comando são substituídas por (ou "expandidas" para) o valor da variável por Bash no momento da avaliação do comando , :$PATHé colocado no final do valor a ser atribuído para PATHque PATHacabe contendo ~/.composer/vendor/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games( ou seja, o que PATHjá contém mais ~/.composer/vendor/bin:no início).

kos
fonte
Ótima explicação.
Choylton B. Higginbottom
16

https://help.ubuntu.com/community/EnvironmentVariables provavelmente o ajudará. Também man bashpode ser muito útil para entender como isso funciona (pelo menos no Bash)

Enfim - quanto a PATH=você basicamente definir a PATHvariável, adicionar alguns novos caminhos para pesquisar, adicionar no final os caminhos já definidos / previamente, com $PATH(que é basicamente uma referência à PATHvariável).

Então, digamos que você PATHestava até agora definido como algo como:

PATH="x:y:z"

e então você define

PATH="a:b:c:$PATH"

seu PATHdepois disso será como:

a:b:c:x:y:z

Espero que faça sentido.

Além disso, você exporta a nova variável para que ela seja conhecida em seu ambiente, incluindo também processos / subshells filhos.

Lembre-se também de que a ordem dos diretórios configurados PATHpode ser importante. E algo como PATH="$PATH:a:b:c"lhe dará o resultado:

x:y:z:a:b:c

que afetará a ordem dos diretórios / caminhos ao procurar por um comando (se você tiver seu comando em mais de um diretório, o primeiro encontrado será usado - o que pode gerar resultados inesperados algumas vezes).

Jacek
fonte
2

Aqui está o comando para que todos possam acompanhar o andamento dos tópicos. export PATH="~/.composer/vendor/bin:$PATH"

  • exportO /bin/exportcomando interno do shell (o que significa que não existe , é uma coisa do shell) basicamente disponibiliza variáveis ​​de ambiente para outros programas chamados a partir de bash(veja a questão vinculada em Extra Reading) e os subshells.
  • A atribuição no shell ocorrerá primeiro na expansão, depois a atribuição ocorrerá em segundo. Portanto, o que está dentro de aspas duplas é expandido primeiro, salvo na PATHvariável posteriormente.
  • $PATHé a PATHatribuição padrão (ou pelo menos a aparência da variável até esse comando aparecer no seu .bashrcou .profile) e expanda-o.
  • ~/.composer/vendor/binvai expandir para /home/username/.composer/vendor/bin, onde .composerestá a pasta oculta devido ao ponto inicial.
  • Esse curto ~/.composer/vendor/bin:$PATHagora se transformou em uma longa lista de pastas, separadas por :. Tudo é colocado entre aspas duplas para incluir pastas com espaços no caminho.
  • Finalmente, tudo é armazenado em PATHcomandos variáveis ​​e externos permitidos para usá-lo

Exemplo Simples

Meu shell interativo é mksh, na verdade , o que também passou a ser exportincorporado. Ao usar exportpara definir VAR, minha variável pode ser transmitida e usada por uma cadeia de comandos / subprocessos subsequentes, onde eu exportei a mesma variável

$ echo $SHELL            
/bin/mksh
$ VAR="HelloAskUbuntu"
$ bash -c 'echo $VAR' 
$ export VAR="HelloAskUbuntu"                                                  
$ bash -c 'echo $VAR'                                                          
HelloAskUbuntu
$ 

Leitura Extra

Sergiy Kolodyazhnyy
fonte
3
Não, o ~in ~/.composer/vendor/binnão será expandido! O til só é expandido em alguns lugares especiais, como logo após o =sinal. PATH="~/.foo:$PATH"resulta em ~/.foo:/other/path/dirs.... Mas ~seria expandido PATH=~"/.foo:$PATH", o que resulta em /home/user/.foo:/other/path/dirs....
Volker Siegel
2

Eu li aqui e em outros lugares da web, conversei com um amigo sobre isso e decidi que, como calouro (talvez mais calouro do Ubuntu do que alguns aqui possam pensar), eu deveria mapear este comando - eu deveria fazer um mapa e então aprenda o que é o paradeiro e o paradeiro:

Dados preliminares

Se por enquanto você não entendeu algo neste capítulo - não se preocupe, isso ficará mais claro à medida que você continua lendo, mas para entender esse assunto, você precisa ler sobre as variáveis ​​de ambiente (EVs), seus valores e finalidade . Agora tentarei explicar o comando em palavras simples e em um método de mapeamento, para iniciantes como eu e apenas para iniciantes. Tentei fazer o meu melhor aqui ...

Mapeamento

export PATH="~/.composer/vendor/bin:$PATH"

O valor original do EV "PATH", como vem no Ubuntu 15.10, é:

/usr/bin:/usr/sbin

No próprio comando note, temos duas frases PATH. O último é $ PATH - O $ diz "imprima o valor original ou valores do EV próximo a você"; O EV próximo a ele é o PATH EV.

Nós exportada a variável de caminho-se (tornou disponível para sub processos, bem como, IE processos que são executados na CLI que não são realmente o shell Bash, mas correr dentro dele (como Drush , que é o Drupal CLI).

Além da exportação, também a expandimos: A primeira frase PATH (PATH =) nos usou para adicionar um valor extra (~ / .composer / vendor / bin :) ao valor original (representado por $ PATH).

  • Os dois pontos (:) no final do novo valor que mencionei no parágrafo acima, usam para distinguir o novo valor do original.

  • "" São a área em que os valores residem.

  • O ~ é a pasta inicial.


Espero que, após esse mapeamento, o comando seja mais claro para calouros como eu.

JohnDoea
fonte
1

O exportcomando disponibiliza variáveis ​​em subshells. Ou seja, sem ela, a variável PATHnão seria visível em sub-conchas.

PATH é mencionado duas vezes:

  • Como variável, o valor está sendo atribuído, à esquerda do =sinal.
  • Como nome da variável sendo substituído pelo seu valor à direita do =sinal. Isso faz com que o valor antigo faça parte do novo valor.
rexkogitans
fonte
1
"Ou seja, sem ela, a variável PATHnão seria visível em sub-conchas." Isso está incorreto; PATHé uma variável de ambiente (que não é exatamente a mesma coisa que uma variável de shell ), portanto é exportada automaticamente e o exportcomando é desnecessário.
David David
A família de shell Bourne realmente não distingue entre variáveis ​​de shell e de ambiente. ( sc.tamu.edu/help/general/unix/vars.html ) No meu sistema (Arch Linux), o bash nem conhece o setenvcomando.
Rexkogitans
1
Ainda existe uma diferença entre as variáveis ​​de ambiente que o kernel conhece e as variáveis ​​do shell que são internas ao bash. Como se PATHorigina do ambiente, ele é exportado automaticamente, portanto, você não precisa executar exportpara que as alterações sejam propagadas para processos filho (ao contrário do que diz a página que você vinculou).
David
Variáveis ​​de ambiente não são propriedade do kernel, mas do processo. Como o processo que estamos falando aqui é sh, bash (o Ubuntu usa o zsh?), Acho que podemos deixá-los iguais às variáveis ​​do shell. Mas, é claro, as variáveis ​​do shell não são passadas para nenhum programa aleatório como as variáveis ​​de ambiente.
Rexkogitans
Acho que estamos ficando atolados na semântica neste momento. Tudo o que eu estava tentando dizer era que no bash PATH=fooe export PATH=footenho comportamento idêntico.
David
0
export PATH="~/.composer/vendor/bin:$PATH"
  1. o exportcomando é um buildin do bash, significa que variáveis ​​de exportação são variáveis ​​de ambiente. (você pode digitar help exportpara se inclinar mais

    (os caracteres seguem o comando são parâmetros, divididos por espaço, portanto, neste caso, existe apenas um parâmetro)

  2. o PATHé o nome da variável, geralmente, varibale predefinido por bash, ser nomeado em maiúsculas.

  3. os =meios atribuem valor a essa variável.

  4. toda a string é o valor da varibale

  5. o $PATHé um tipo de função do bash, nomeado variable expantion, o bash substituirá o valor do existente PATHna cadeia de parâmetros, ANTES de enviar a cadeia para o exportcomando

  6. o :em um caractere espacial na variável PATH e compreendido por todos os aplicativos que desejam usar essa variável. isso significa separador. então eles terão muitos diretórios na variável PATH.

lovespring
fonte