O que os 'set' e 'export' dos bash-builtins fazem?


46

Estou um pouco perdido quanto ao propósito de sete exportno Bash (e acho que provavelmente outras conchas também).

Eu acho que é para definir variáveis ​​de ambiente, mas isso pode ser feito apenas com VARIABLE=VALUE, certo?

Também a digitação sete exportpor conta própria mostra valores diferentes.

Então, qual é o seu propósito?



Eu sempre começo pelo script bash com os dois a seguir. #! / usr / bin / env bash set -euxo pipefail Este link explica perfeitamente o mesmo. coderwall.com/p/fkfaqq/…
147,3k

Respostas:


50

exportexporta para filhos do processo atual; por padrão, eles não são exportados. Por exemplo:

$ foo=bar
$ echo "$foo"
bar
$ bash -c 'echo "$foo"'

$ export foo
$ bash -c 'echo "$foo"'
bar

set, por outro lado, define os atributos do shell, por exemplo, os parâmetros posicionais.

$ set foo=baz
$ echo "$1"
foo=baz

Observe que baznão está atribuído a foo, ele simplesmente se torna um parâmetro posicional literal. Existem muitas outras coisas que setpodem ser feitas (principalmente opções de shell), veja help set.

Quanto à impressão, exportchamada sem argumentos imprime todas as variáveis ​​no ambiente do shell. settambém imprime variáveis ​​que não são exportadas. Também pode exportar alguns outros objetos (embora você deva observar que isso não é portátil), consulte help export.


Obrigado, que é uma resposta muito útil. No entanto, quando eu defino o http_proxy apenas com http_proxy = abc.com , ele fica visível para os processos filhos, por exemplo, executando o wget sem que eu exporte. Como isso pode ser?
mydoghasworms

2
@mydoghasworms Duas razões possíveis. Um, você está executando o comando como foo=bar command. Esta é uma exportação implícita para um único comando. A segunda possibilidade é que http_proxyjá foi exportada para o seu ambiente antes de você modificá-lo.
Chris Baixo

Ah sim, você está certo. Brilhante, obrigado!
Mydoghasworms

6

Veja help set: set é usado para definir atributos de shell e atributos posicionais.

Variáveis ​​que não são exportadas não são herdadas por processos filhos. exporté usado para marcar uma variável para exportação.

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.