Como exportar variáveis ​​definidas de uma só vez?

39

setO comando exibe todas as variáveis ​​locais, como abaixo. Como exportar essas variáveis ​​de uma só vez?

>set
a=123
b="asd asd"
c="hello world"
Neerav
fonte
o que você quer dizer com exportar de uma só vez? você pode usar dois pontos semi definir em uma linha ... como a = 123; b = "asd asd"; c = "Olá mundo"
Raza
Muito semelhante ao unix.stackexchange.com/q/79064/4667
Glenn Jackman
2
setTambém mostra as funções e variáveis do sistema, como BASH_VERSION
Glenn Jackman
Sua pergunta não está clara. Esse é um trecho da setsaída que você está mostrando? Se sim, então não bashé. Deseja exportar todas as variáveis ​​atualmente definidas, incluindo as variáveis ​​especiais do shell? Ou apenas essas 3 variáveis ​​estão em export a b c?
Stéphane Chazelas
export ${!T*}exportaria qualquer parâmetro definido cujo nome comece com T. Infelizmente, não parece haver uma maneira de gerar facilmente uma lista de todos os parâmetros definidos.
chepner

Respostas:

72

Execute o seguinte comando, antes de definir as variáveis:

set -a 

página de manual:

-a
Quando esta opção está ativada, o atributo de exportação deve ser definido para cada variável para a qual uma atribuição é executada;

Para desativar esta opção, execute set +adepois.

Exemplo:

set -a
. ./environment
set +a

Onde environmentcontém:

FOO=BAR
BAS='quote when using spaces'
nitina
fonte
13
Isso deve ser ativado antes de atribuir às variáveis. Ele não faz nada com variáveis ​​atribuídas anteriormente.
chepner
11
@chepner, obrigado esqueci de mencionar isso !!
Nitin
Isso também exporta automaticamente funções da mesma maneira que:function example(){ echo good; }; export -f example
Oliver I
5
`echo "export" $((set -o posix ; set)|awk -F "=" 'BEGIN{ORS=" "}1 $1~/[a-zA-Z_][a-zA-Z0-9_]*/ {print $1}')`
  1. Primeiro, obtenha todas as variáveis ​​de ambiente definidas: (set -o posix ; set) Referência: https://superuser.com/questions/420295/how-do-i-see-a-list-of-all-currently-defined-environment-variables-in-a- linux-ba

  2. Obtenha todos os nomes de variáveis ​​de ambiente, separados por espaço: awk -F "=" 'BEGIN{ORS=" "}1 $1~/[a-zA-Z_][a-zA-Z0-9_]*/ {print $1}' Referência: awk-Printing valor da coluna sem nova linha e incluindo vírgula e https://stackoverflow.com/questions/14212993/regular-expression-to-match-a-pattern-inside- comando awk

  3. Agora, precisamos exportar essas variáveis, mas o xargs não pode fazer isso porque bifurca o processo filho, a exportação precisa ser executada no processo atual. echo "export" ...Crie um comando que desejamos e use `` para executá-lo. É tudo: p.

Bear Huang
fonte
Bem-vindo à U&L SE. Talvez você possa editar sua postagem e dar algumas explicações.
Archemar 06/03
11
Não é correto supor que os nomes de variáveis ​​de ambiente consistam apenas em az e AZ. Eles geralmente incluem sublinhados e dígitos também, então o padrão seria [a-zA-Z_][a-zA-Z0-9_]*. Existem algumas variações com base no shell que você está usando, mas esta é a abordagem segura / portátil.
Chris Johnson
Good point @ChrisJohnson - atualizado!
Wil Moore III
3

Você pode anexar exporto nome da variável via awke evala saída resultante:

eval $(printenv | awk -F= '{ print "export " $1 }')
Wil Moore III
fonte
2
printenvimprime as variáveis ​​que já foram exportadas. Isso também não funcionará corretamente se houver variáveis ​​que contenham caracteres de nova linha.
Stéphane Chazelas
2

Isso funciona se o seu shell for bash (possivelmente outras conchas também)

export > /my/env/var/file

seu novo arquivo conterá um despejo de todas as variáveis ​​definidas atualmente ... com entradas como

declare -x PORT="9000"
declare -x PORT_ADMIN="3001"
declare -x PORT_DOCKER_REGISTRY="5000"
declare -x PORT_ENDUSER="3000"
declare -x PRE_BUILD_DIR="/cryptdata6/var/log/tmp/khufu01/loud_deploy/curr/loud-build/hygge"
declare -x PROJECT_ID="hygge"
declare -x PROJECT_ID_BUSHIDO="bushido"

então para levantar o shell atual com todos esses env vars questão

source  /my/env/var/file
Scott Stensland
fonte