Script que exporta variáveis ambientais não pode exportá-las [duplicado]

1

Eu tenho o seguinte script chamado export.sh :

#!/bin/bash

SOURCE="${BASH_SOURCE[0]}"
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
  DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
  SOURCE="$(readlink "$SOURCE")"
  [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
done

SOURCE=$(dirname ${SOURCE})

export $(cat "${SOURCE}/../params.env" | xargs)

Em algumas palavras, o que acontece é exportar variáveis ambientais a partir de um arquivo chamado params.env que está localizado por convenção na pasta prarent e exporta o conteúdo como uma variável ambiental.

Os conteúdos de amostra do arquivo params.env são:

SOMEVAR="val1"
SOMEVAR2="val2"

E uma execução bem-sucedida me fornecerá SOMEVAR com valor val1 e SOMEVAR2 com valor val2 variáveis ambientais.

Mas se eu correr:

./export.sh

E depois

printenv | grep SOMEVAR

Não mostra que a variável ambiental está definida.

    
por Dimitrios Desyllas 20.10.2017 / 09:16

1 resposta

1

A idéia toda está certa, mas você acaba executando o script de shell em vez de sourcing para fazer o ambiente mudar no shell atual.

Lembre-se sempre, a execução de um script executa um sub-shell e todas as variáveis de ambiente do sistema exportadas são perdidas após o sub-shell ser finalizado.

Veja o que acontece quando você executa o script é executado, com o modo de depuração definido -x (FYI, estou usando params.env da pasta atual)

$ bash -x script.sh
+ SOURCE=script.sh
+ '[' -h script.sh ']'
++ dirname script.sh
+ SOURCE=.
++ cat ./params.env
++ xargs
+ export SOMEVAR=val1 SOMEVAR2=val2
+ SOMEVAR=val1
+ SOMEVAR2=val2

Você pode ver que as variáveis estão definidas, mas o sub-shell destrói as variáveis exportadas. Agora, ao pesquisar o script,

source script.sh
printenv | grep SOMEVAR
SOMEVAR=val1
SOMEVAR2=val2

Se a sua versão bash não der suporte a um comando source explícito, use as formas POSIX de fazer . ./script.sh

    
por 20.10.2017 / 09:26