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?

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

Chris Down
fonte
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.

choroba
fonte