A principal coisa a notar é que você provavelmente não precisa exportar essas variáveis; essa necessidade é reservada somente quando um subprocesso está consultando seu ambiente herdado para uma variável. Normalmente, as pessoas estão exportando uma variável e fazendo algo como somecmd "$myexportedvar"
. Seu shell está expandindo $myexportedvar
antes que somecmd
o veja.
Se você realmente precisar exportá-los para um subprocesso extrair do ambiente:
while IFS= read -r line; do
if [[ $line == *=* && $line != #* ]]; then
IFS== read -r var val <<<"$line"
printf -v "$var" '%s' "$val"
export "$var"
fi
done < "$HOME/variables.txt"
esse loop verifica se a linha é uma atribuição (meio) e se o primeiro caractere não é um hash de comentário. torna o esforço um pouco mais robusto, mas apenas mal. veja as duas opções abaixo, para lidar com isso com mais cuidado.
como um aparte, o loop acima garantirá que você não esteja executando o arquivo conforme ele é analisado. source
avalia cada linha e realmente executa todas elas, então meu loop eliminará esse "problema" (se você considerar um problema).
Como alternativa, basta exportar as vars no arquivo original, em seguida, source "$HOME/variables.txt"
e o trabalho já está pronto.
você pode querer usar apenas set -a; . "$HOME"/variables.txt; set +a
. isso evita um problema em que o arquivo originado não consiste somente de atribuições. o loop de análise acima pode resultar em falsos positivos. leia help set
para entender o que está fazendo.
Além disso, Não leia as linhas com e Usar mais cotações