Estou procurando uma maneira de determinar em um script quais variáveis de ambiente outro script define. O script que define as variáveis de ambiente ( env.sh
) possui várias lógicas para recuperar os valores dessas variáveis, e eu gostaria de determinar se esses valores mudaram de uma versão do repositório para outra (mas não consigo rastrear o conteúdo do arquivo env.sh
only porque ele pode permanecer inalterado, mesmo que as variáveis de ambiente declaradas tenham mudado).
# main.sh
# Call env.sh to calculate a hash over the environment variables it has set (no idea how)
bash ./env.sh
# env.sh
export foo="foo" # could be changed directly in another version
export bar=`cat barversion` # content in `barversion` itself could change, but not env.sh
# ... more could be added, but we don't want to assume knowledge about this in main.sh
Um arquivo que é referenciado por env.sh
which pode mudar, o que faz com que as variáveis de ambiente exportadas mudem, o que deve gerar um hash diferente
# barversion
1.0
O ideal é que a chamada de bash ./env.sh
in main.sh
não polua o escopo da variável de ambiente in main.sh
(na verdade, bash ./env.sh
não precisa ser chamada assim. A linha é apenas um espaço reservado para indicar onde estou com dificuldades).
Qualquer ajuda ou indicação na direção certa seria apreciada.
Você pode tentar algo assim, usando
declare -p
para imprimir valores antes e depois do sourcingenv.sh
em um subshell:Se você estiver interessado apenas em variáveis exportadas, você pode alterar cada uma
grep -vE '^declare -- (old|_)='
paragrep '^declare -x'
ou, de preferência, como @pjh sugeriu em um comentário , alterar cada umadeclare -p | grep -vE '^declare -- (old|_)='
para apenasexport -p
:Pense em nomes mais esotéricos com os quais você fique satisfeito ou use arquivos temporários se achar que
old
,new
e/oufile
nomes de variáveis podem ser modificados porenv.sh
.Considere algo como:
Agora, por que
< <(cat /proc/self/environ)
em vez de</proc/self/environ
? O motivo é que queremos comparar com as variáveis de ambiente atuais do seu shell inicial , em vez das variáveis de ambiente iniciais . Os dados do procfs refletem apenas o ambiente inicial , não o ambiente atual ; usarcat
garante que estamos capturando o ambiente no momento em quecat
ele é iniciado , não no momento em que cada processo é iniciado.