O que o comando 'export' faz?

86

Sou um pouco novo no Linux e, por acaso, executo alguns comandos às cegas, para fazer as coisas. Achei que não seria um desperdício fazer esse tipo de pergunta, já que mais gente nova teria um conhecimento regular sobre elas.

Comecei a trabalhar com o Jenkins recentemente e tive que usar esse exportcomando para executar o arquivo de guerra do Jenkins . Portanto, eu precisava saber o que o exportcomando faz em geral e por que precisamos executá-lo ao executar o Jenkins (depois que a página inicial do Jenkins for definida).

Obrigado!

Chathura Kulasinghe
fonte
1
Ajudaria se você falasse mais sobre o comando de exportação usado. Sem mais contexto, acho que você estava definindo uma variável de ambiente. Consulte en.wikipedia.org/wiki/Environment_variable#Unix
Joshua D. Boyd
4
possível duplicata de bash: definindo uma variável com ou sem exportação
tripleee
possível duplicata do comando de exportação unix
John Kugelman

Respostas:

99

exportem she shells relacionados (como bash), marca uma variável de ambiente a ser exportada para processos-filho, para que o filho os herde.

exporté definido em POSIX :

O shell deve fornecer o atributo de exportação para as variáveis ​​correspondentes aos nomes especificados, o que deve fazer com que elas estejam no ambiente de comandos executados posteriormente. Se o nome de uma variável é seguido por = palavra, então o valor dessa variável deve ser definido como palavra.

Yann Ramin
fonte
Muito obrigado! Todas as suas respostas foram realmente úteis e orientam para aprender mais algumas coisas também! :-)
Chathura Kulasinghe
1
O que é um processo filho nesse sentido?
AsyncMoksha
@MartinHansen o que você não entende? também, veja minha resposta.
Barlop 02 de
Há um colchete extra no final do link, não posso editá-lo porque é edição de um símbolo :)
Radoslav Stoyanov
28

Eu acho que você está vindo de um fundo de janela. Então, vou contrastá-los (também sou meio novo no Linux). Achei a resposta do usuário ao meu comentário útil para descobrir as coisas.

No Windows, uma variável pode ser permanente ou não. O termo variável de ambiente inclui uma variável definida no shell cmd com o comando SET, bem como quando a variável é definida na GUI do Windows, portanto definida no registro e tornando-se visível em novas janelas cmd. por exemplo, documentação para o comando set no Windows https://technet.microsoft.com/en-us/library/bb490998.aspx "Exibe, define ou remove variáveis ​​de ambiente. Usado sem parâmetros, definir exibe as configurações de ambiente atuais." No Linux, set não exibe variáveis ​​de ambiente, ele exibe variáveis ​​de shell que ele não chama / se refere como variáveis ​​de ambiente. Além disso, o Linux não usa set para definir variáveis ​​(além de parâmetros posicionais e opções de shell, que explico como uma nota no final), apenas para exibi-los e mesmo assim apenas para exibir variáveis ​​de shell. O Windows usa set para definir e exibir, por exemplo, set a = 5, o Linux não.

No Linux, acho que você poderia fazer um script que define variáveis ​​na inicialização, por exemplo, /etc/profileou /etc/.bashrcmas caso contrário, elas não são permanentes. Eles são armazenados na RAM.

Há uma distinção no Linux entre variáveis ​​de shell e variáveis ​​de ambiente. No Linux, as variáveis ​​do shell estão apenas no shell atual, e as variáveis ​​de ambiente estão naquele shell e em todos os shells filhos.

Você pode ver as variáveis ​​do shell com o setcomando (embora observe que, ao contrário do Windows, as variáveis ​​não são definidas no Linux com o comando set).

set -o posix; set (fazer aquele set -o posix uma vez primeiro, ajuda a não exibir muitas coisas desnecessárias). Então setexibe variáveis ​​de shell.

Você pode ver as variáveis ​​de ambiente com o envcomando

variáveis ​​de shell são definidas com, por exemplo, apenas a = 5

as variáveis ​​de ambiente são definidas com export, export também define a variável shell

Aqui, você vê a variável shell zzz definida com zzz = 5 e mostra quando está em execução, setmas não como uma variável de ambiente.

Aqui vemos yyy definido com exportação, portanto, é uma variável de ambiente. E veja como é mostrado nas variáveis ​​de shell e nas variáveis ​​de ambiente

$ zzz=5

$ set | grep zzz
zzz=5

$ env | grep zzz

$ export yyy=5

$ set | grep yyy
yyy=5

$ env | grep yyy
yyy=5

$

outros tópicos úteis

/unix/176001/how-can-i-list-all-shell-variables

/ubuntu/26318/environment-variable-vs-shell-variable-whats-the-difference

Nota - um ponto que elabora um pouco e é um tanto corretivo ao que escrevi, é que, no bash do Linux, 'set' pode ser usado para definir "parâmetros posicionais" e "opções / atributos do shell" e, tecnicamente, ambos essas são variáveis, embora as páginas do manual não as descrevam como tal. Mas ainda, como mencionado, set não definirá variáveis ​​de shell ou variáveis ​​de ambiente). Se você fizer set asdfisso, ele definirá $ 1 como asdf, e se você vir, echo $1você verá asdf. Se você fizerset a=5ele não definirá a variável a, igual a 5. Ele definirá o parâmetro posicional $ 1 igual à string de "a = 5". Então, se você já viu definir a = 5 no Linux, provavelmente é um erro, a menos que alguém realmente quisesse a string a = 5, em $ 1. A outra coisa que o conjunto do Linux pode definir são as opções / atributos do shell. Se você definir -o, verá uma lista deles. E você pode fazer, por exemplo set -o verbose, desligar, para ativar o verbose (a propósito, o padrão é desativado, mas isso não faz diferença). Ou você pode fazer set +o verbosepara desligar o verbose. O Windows não tem esse uso para seu comando set.

barlop
fonte
parece que set mostra shell e ambiente, e 'env' mostra apenas ambiente
barlop
1
Gosto muito dessa resposta, pois ela cobre casos nix vs win, que podem ser confusos no início.
Nada de
6

Em termos simples, as variáveis ​​de ambiente são definidas quando você abre uma nova sessão de shell. A qualquer momento, se você alterar qualquer um dos valores das variáveis, o shell não terá como escolher essa alteração. isso significa que as alterações feitas tornam-se efetivas em novas sessões de shell. O exportcomando, por outro lado, oferece a capacidade de atualizar a sessão de shell atual sobre a alteração feita na variável exportada. Você não precisa esperar até uma nova sessão de shell para usar o valor da variável que você alterou.

Katwekibs
fonte
1
Mas se eu disser a=5então echo $a, ele dirá 5. No entanto, você escreveu "a qualquer momento, se alterar qualquer um dos valores das variáveis, o shell não tem como escolher essa mudança. Isso significa que as alterações feitas tornam-se efetivas em novas sessões de shell." . <- Então, como ele atualizou a sessão do shell sem uma exportação. Você pode dar um exemplo onde a exportação é necessária?
barlop
A variável que você define durante uma sessão de shell é uma variável de shell. é local e acessível à sessão de shell atual. você pode alterá-lo a qualquer momento que desejar e seu valor atual estará disponível para o processo shell atual sem a necessidade de exportar as alterações. por outro lado, as variáveis ​​ambientais são definidas no momento do login. ao alterar qualquer um de seus valores, você precisa realizar o que, em termos simples, seria uma atualização, tornando o novo valor disponível para o processo shell atual e quaisquer novos processos filho. isso é exatamente o que a exportação faz.
katwekibs