Identifique variáveis definidas pelo usuário

1

Em um shell bash do GNU / Linux, estou usando um comando para identificar e salvar todas as variáveis definidas pelo usuário em um momento específico para fins de depuração (eu forneço o arquivo mais tarde):

declare | grep '^[[:lower:]]' | grep -v '^colors' | sort > ${output_dir}/env_variables.tmp

Estou ciente de que esta é uma prática ruim, já que estou "programando por coincidência", confiando que todas as variáveis do sistema (exceto colors ) começarão com uma letra maiúscula - eu gostaria de encontrar uma maneira melhor .

Eu também considerei salvar uma versão das minhas variáveis env antes de executar o script e, em seguida, simplesmente diferenciar as variáveis env no shell filho com ele. Isso parece tão hack-ish quanto a minha tentativa atual, então eu estava me perguntando se existe uma maneira de filtrar variáveis por data ou usuário definido, ou qualquer outro critério para identificar aqueles que foram criados recentemente por um determinado shell filho?

    
por mlegge 08.05.2015 / 22:14

2 respostas

2

Não, não há como filtrar variáveis por data ou por quem a possuiu. Você PODERIA definir todas as variáveis existentes como somente leitura e depois usar declare -p para filtrá-las. Mas uma maneira mais comum de resolver isso é prefixar todos os seus vairables com __project_ (onde project é o que for). As variáveis ficam longas, mas essa parece ser a maneira mais segura.

Sua idéia de salvar as variáveis na inicialização não é ruim. Você pode salvar apenas os nomes com

 declare |awk -F= '/=/ { print $1 }' >tmpfile.$$.shvars

Ou voltando à ideia somente leitura:

 while read var ; do declare -r var; done < tmpfile.$$.shvars

Agora você declara o seu e, mais tarde, quando terminar:

 declare -p |awk '$2 !~ /^.r$/ { print $3 }' |cut -d= -f1

mostra a lista de suas variáveis. A desvantagem é que todas essas variáveis são agora somente leitura que não deveriam ser.

    
por 08.05.2015 / 22:43
1

No shell, quando você define uma variável (variável de ambiente ou parâmetros não-exportados), não há diferença entre essa nova variável e qualquer outra que já tenha sido definida anteriormente. Assim, (variações sobre) as duas soluções que você pensou, quais são:

  • Use uma convenção de nomenclatura para descrever em quais você está interessado (maiúsculas e minúsculas)
  • Pegue um antes & depois do instantâneo

são tão bem quanto você pode fazer.

    
por 08.05.2015 / 22:31